From 172596309035eba80b081f76d4b80f2c8ea37f49 Mon Sep 17 00:00:00 2001 From: AshwiniDPrabhu <49379016+AshwiniDPrabhu@users.noreply.github.com> Date: Sun, 5 Jan 2020 12:51:55 -0500 Subject: [PATCH] Add files via upload --- CIS563 Project Report.pdf | Bin 0 -> 533398 bytes KNN.html | 16849 ++++++++++++++++++++++++++++++++++++ KNN.ipynb | 3767 ++++++++ Spark_ALS.html | 14616 +++++++++++++++++++++++++++++++ Spark_ALS.ipynb | 1518 ++++ Subset_Spark_ALS.html | 15098 ++++++++++++++++++++++++++++++++ Subset_Spark_ALS.ipynb | 2056 +++++ 7 files changed, 53904 insertions(+) create mode 100644 CIS563 Project Report.pdf create mode 100644 KNN.html create mode 100644 KNN.ipynb create mode 100644 Spark_ALS.html create mode 100644 Spark_ALS.ipynb create mode 100644 Subset_Spark_ALS.html create mode 100644 Subset_Spark_ALS.ipynb diff --git a/CIS563 Project Report.pdf b/CIS563 Project Report.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f801c66cb7f3a0fd0126a5d03231693df1e9559b GIT binary patch literal 533398 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�gM#~~L?^BkDQR>w{6t3chH3}hmrQS0s#*hPU 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⋙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%0Ajej@mOnn>zwTK@L2F5)Lj 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
Z@oZdXuCp6ko zvp|O~0v->OIJM=s&p)z5ghy{E6kFu_V#igE;+9>5V8O-+)EioA&sj6;Dip}F^+hk+ zw(&#WlWfzs9O^}MSy97t=Htm-StOpBs_7-`++ynB&Ysh!;MNepIazMMo^DEKVPVHK zddGcbHe}%5qXhZrHLV?}qfAmVUbl5P&wV|Z?M2^<;yAExB}8@R4@i5R+_+)QEuBC|f%`4&&kBnO8biNc zTWv1=M$xWR>(6c_UM|2POnO$PK_fEzttk-tj3p)pYxiy^S*x$?6GXfc%_OatJw+4s z-*};+s17J1%_<L#>V(3M3HyB&HCago+qX!%)09xGFn5udg|qH~ZReEwSEV>ENXB8Q`3(z8 zsP3tydEd5kxXnR)?Oh9GBwTYHCl6mqynNnM$qvYmGUQ;}j!ZW24;K*h${J5Khcd#} zD}v~--dfMjM$M@kn2-MM?+Y@$}h6! zbCyur^=k9|oHRrGysoc{R<8a)Cf1XeACM#-_F!96Jle=Hwoi`2CR;X(9vHscs9u@K z2Zv!1K$-OdN%^w<9#fo2 zI%br})x040<~t-=j+U79!4;zFyl?%C$IJm~s(3f$4BP+?Bo+;O+$sU3H!P0oD1%Yr z_jNR|M%bfQ7|v%d=7`nQBhwM9h>dn4hS(wu{F(I%?Y|W^>p1<8b@>Ig+}C%fHY`tD zfADNRiAuv)#WWj9@gaR>t`~oabQ5$aUsM0ok`X|#(y*dus9I@HaXa$Tf(vuc7wv`W zH_tw0wws6TRI_94}oYa>iJ-faSs zX4kP-?@H}USO5`5n!Ik*aQT!heG6@{h##{ATd=ojWROnhu>$#ENW9DmQT$RGVYN}Y zz~{)PBjVj(TZ+ukmd~OdPowMoa^>->gk!5@?ng@K^R{M^W?zYdjMh>ZOEmcfFV)h3 znv$WVp}N;2O{Yt7@aHM8N99ISo+i)}cyx&8{dfRh&p^Z<>~_3(*4>h@ zc*U_-b~9O}GIpBLTp&^VhdGlNGzEkb<3I^LYKn3qZbY@=~S*aF|=pw9eHo*O@Yu}5*R zHJ@>%8N}Q76cgf`3kjdQ#0>2xsmEeh|TlDxmT7> zXit+;h3?L=>Y9&+knwnT7ACrUaYehF7cADnDny6VJX#Db9HFq(ej4&KLqn zmUyboi7oubMPO?@lX7QnPhI_LX#YL6i}|B!fm_t}^LYK@ot^th713OzgSk8H@9K|( z+fAz-52NtIbjk%Z%F5xki|{l?lJ>TiB?wg_zSk7)(1pV~RN~6gVxBA*mZniNVka+o z>9Fo6j5dLkBIAYo;+Awy8O?5Vo5=nu^`-QRXJz?4VXkv>kFNn*Kh@S*-|0|oErKWNJYxC=Fn;{64I5%*p%Srm2cje{vXe#w`c`vz{_g@fRiG+(rs z;5J1y8PsKCWDLhPusO;4>!Uecs{P^?=9F~E3G8gESB)Lgl5aVov3+FCZy40goU|UO z#&325eWT;(IurS&FFVzub#_obxDK~As_btP?G*?^N1asDjBGewymg;%**w^fS_?~l z3^f5~d${NjUy9vn{4N3LMcfp?d|Sq$XLi0*i`g`2>SR;3<|JWBe}6$pf6w7nCikP9 zcMB?O;w{GZ{&X70i_y}bVl5(S_8sEuw__1hbghMVpbQgkV;xp(KQddQO+ObxMCKu@ z!KB3{2r5K4z5e2sw$6MBBBkiow8JVTVX5Vbre1XJW5H20BSENKSpnEBdC{I@q1^k8KiqO(A88qV0v` z6#=>Y9LovRk!8s@@ZO@K#>((EL3iovEwyWg8LJK)H$OzkIBl^{Lzs<;)$elM)C;W& z;3-DPS(-kGn+{kP+Z`Nr!Z&W8R-9DMh##nDWQc!79qJYOjF z)m+H$DU;X0-J}@qvjlIVG_$XB%z5U&x*sOU2IXf7`tG_(NJevO5_Fy_{}QAsb7UH% znwMjf$m)CeqF8FswY=lHW5NFOjmANZf-rGX&Ejs#+rlPQ6mpgDN{$o0Q-7SJo}({T zcjanrTk%s%*oXZY4ZbW)bHplCQ$YOaByS)`%`$ulw{Am8Zx>_4$L;CU)ZJhT+tJYyG|1A-+tSc_7FnQLNgg|7EIMV-Ts1>oqN! zb`IS9@F#RXX;(g|F0*7-%Z+LWHs2*rK6A*^om?O?_Ynu)&J}$+*wQP!M^T?Y))9<6KjE0!|k(D5ioQw6}BA0oM4(mCI;&B;gcDL;( zj}xtskveUh;~#v&NLOMQ9xoYFnLBEWdA{{-f4CODT2N^axR2c+e=6i-4^lPB_3|jH?(xx(_K>80|oSSq9?w-O#FK~!M9H=I3(-F=6tcIWd&vJ zKZA@Cdgr1}8&yRYM{|Qy-Bk{K4S0V$w=rJT5 zsbq)#V(&GEtQz}1lq3D55cvdO*8BN2zcsnx6kaBGp{&AJt{j!|cQh2<`aAg9)A?A$ zG~!rWv5ekb?-UXO104+ihQr$d27#3(LxJu+wxe}igMf~ zc!0qqwDD!1x>ips|8pn&VoP1332ldQ#?}+Q)bEE!vZHuHb(RJsi1gm-MF{$2)_o-> z@A|klxBAe|k zYL^%hLcL?wn~Zj^An!eTKjq&x0H&ebFiyk|0Z|XAmgh0#O8>%RS?CrIq&(x8xiXC~ zilX=1YHll9rhGk&&^lkKNj>RombznnorLHv+9qHmwtS=T4nmN(P@fuZ@*sx4?YfE$ zojSRikXl80A3k~dF5QD*^1^O1-H{jF?qz?RZr&4)DZ9B3Hmr7%$f{rO2j42*KoGyv zqS1$;7u9>>csN>U!06ed+MEcFDqsqUZgawPPd_QpF07w%u-O;-ij4A!cx+7c>X0Nb zp4oe|yst`6!-yno)>6wBw-Y6EBar2t zF_Uo8uN}mQiZy2$9~b1Rj2$T9RUjZFWVwF7@SCJztrdj!<%RRto}XRHOdD^vs4Ziw zg^6v;)HUm5$g=ruKEhIrqgYmt7#Ck6U^gsS3vvm!b7ySD8>nxJkhLpMA)^%U+P$Gl zvYU~fN%InQmymRO(rER7aG{~gmLR?0s>++e4tv_xk!CeAfcTf&5P?+ukqp684K4fc z=9K}>oTI-wGhT>Y>qR?D3$BYu7b0s)(*XTZPYYL%WPC%7#b6!lWH~hFDef=yO1o^HrN}%xe}s3B={bz?B{Jo|dE) zDFs4?0UJl+=>0N~LtlXzk|deDv1B5O$@3jd;?>C`{^PfF{8mGqKfL<(4bWnS8M6X7 z22i#_lxiFZZqq~_>(f04gYtkmM3C)lWq}DVawPt8{G9u4Ns%A@I*_>sA40!?SGPPei)NES2Yi;`-Gn;HE0Qi5 z+IMBU|4A2s20o+7mk$7OqHmawvaWtAenDk;|78&^{o5i62%q=xb5RUekmBvhf{7?I z@&JL{WR=T6V9)vN61Z@U8=Pmaay1}eIEdnErMf{WIickpi4*-O+zup!sQM}H1q$hD zlr@?1y*B1I3CT+IwXO*I8x(bw{I%~7kb^BoPr-b)b@L0a5s;0c0GaFsARwDdq57_q z1?VtQoK6`${MF}@YiNI_&GHu^{T~usYitlKhcZr3-TMvol+r1$1ws%rG0&@6(N5o* z-g1(2p!yK~_?1pgf=^wDzXMl{{{!z&AlPqJMk)SAYT7;)%?RhKzbqr~NVfWt%KU{j zu4sf`LpzpIPVW+o@H`p}9i^s*;JW@U)JQb;kH?GGLTf<)NQK1I)6aPi!ebVo7OZ0eD?NP?ADxxE1mv(jmSWXA6g)-vHY#Cud_wpZMiynhvw!Ru01t(6x9j^(1eaTh2+~4Z# z=%!P^f140LVdE@m8q{t5U5vgfYC$Fkh(ACyHi-u?Ah2x$w{R6Na^j!%`j7uUw!E=bmKOYsCB#s7*@RMm~y}dd=F_+@{Uz7*}Laldx0G zkm=u0F!GqujQW`@`>wH|1}j}nh{0J>Y6f}q}*{MuSP%KogHmi3i)@bP}kZqLzW{rY8ZC1b8s?dQ*srS2nv}sW(#FIbw6)cy>&yB~9?g+~ajbdlprr7cYS+DeA zUk!P8O(Vg4guiz3PDp>Pnr&qV@MdH$WP<1eoS|U|(50llzqkShRH4ixQ0i(w1HvEw z59KYl)0`-41u#iv7OZa;w%mift2GCZuTYE}KXF4`ciG#E0ko;3|wt-2FqFy$h~_koc~K%QTQo?+cx0o&o!klfI9a%?nt$KzAK~ zM0%t1?49@X{mQTFUs2nQzYPaiFP*4E0;eunmE{H(6N8Q)JXUtQWgy^ffU?LYNZr_5 zc*#4IIk8f_*wbmMdj;A3B-9sgYjYBv0az*jr<0dg1Cg@F6`6+>+vtB-KhmZR#aljS zNH(6`Sa|xXQ5`{rx7;Enim&a(ZfUPn@C+EunTJBd)m(L7{*v)TT=-Ccj0ytfeSzj* zh?It!?oJnuuIHESr^N9;G|svo&N7?+uXb!KOy0W^meE8awHKjk(MyO`-3JQN7b7#W zmjNUJ7DA$l<-E?A2pO$0@TB22v=Ke3j7~LLLVL^~JrqvPNh`e-_`az31wRx^NYg8Y zGH?kP;Wh*Bh-^ z6eb7Ao8s^)dnOOHoMDAGsTCKf*|R_PkBNDeGmZV(V)agnMm>TGDarg2$Nv<|a-iW8 z?2HayVep>y#}rF2jLY@ z6IU|f4`0}!+mth6(M@T(T=W6bs4ay`7K${Q<&gKv?`;)}|89iCE!PH*Zra+e5q`pz zW+x6=)n{*IrhTXTNBdTD!sv~Wnq5&w5QYNQ(SN^D63@uvRQ*uY%cR@19&G3K1CH;~ z*OtCFb{jkT(WW)(J(VJ42{gi`TogD)yc%P_K~+nqO`^o))~2l9W~V=^;12tkbnh@V zZ1M=0$y|)Xqc+Q_ovyoOIS>}r_F(ZD@*4sE>oJ!eoa&R?GtIzX+UYSJK;~v9z=|^E zP$w}5`2)F=pTU(v<{?S(Z99YG*cY37=(IdWHTez2p-&WfWUg!f`^HBdbMB!PlDIB3 z#fF%j=kK=lnOn-61D8?psrcX%#LaHOP6~6MphbzJF#_?;V(weSPYu>`cT;238j^jI zA3(YG7S;1fGP@XOwJnvrTn1cS>);n}O$}K7R#g0Jr}IKPBC0ND>9|8VQ)>V9?Y|y= zRjs5JSN>jsTYZxNG&(eF-Mez|zkx=*)X|5YmcapN6lZGWe+7-IqLf4kNF$HDIZu77q=q63-vGvFe;0uKVd&eq}~aPzJ5J=rv?J1+71^KEuy z%B=i0djp!lXW#Tzz`=2O zwP&B6Y6+;mfL?0!{m1AoaEQYHcg`qy7Iww89?S}iO6a(toQd9x|AR9c^A~6IJvi*5 zRHb2!69^u4^#uusBDO}hkiSE@mMu+oaY<%0ri-;0I1{6L8eIObzksq=m2sg zd;ukSJyetCi28$)2~5Ea@g3mA8pU1>RH(ne>0Ag7l1g4HsiWwwLYcf$u^=Mj7#MZz zzA|}SRIT#>vum&Xi_h*r2b^`fybSKG$^EEz=~YD*Jtx5BXmg&e z0nF`ffOjxyb}u;2K@}6NCHP_efYHLK+w|1&owXa+AaPzhPlU=6xCG%SvnQR#3b=}5 zz{faAd#NGz`Q}gyhfH!oKsS=hRW17oBcb$9H*5^KLWV0K8*w4E!l~)QhPMlHCI$oO z-W{9LnT3jvz$Ns2T%JOUEh&2W{tdeBvL0}&$-Gl_;B*?H&bcokrwPest6+{f^3~Fo}!0?T>rmO6m{2rGG7i7H_2FX2*B9!)#-| z@)__Z8m_!Gadj9O`DR%OD}0~<#HXn;i={vIfE3w*`W#$fk;LwWM>d|Xj3&FSi$wPU zn->UQ0~KV#X8eTPx7^JBi5UeN+J9n3zy1ei)Bs>c)&Dol=!3s7qdPydR-ADGQ1#ERy@#N$`s@`+ejYU`C*Kb(r2e}p_YYHv z*_&&d(6eUZUP3FT`?U5^(&*MIq2w&GXLDmV%o#Wpw`47HGZMBOU-Fh~#TKua zK~b?sNxK`Zy7E)*YzI%hU<#|aF&1}10ut2?TZ?Y#F=&>*6dowE*)=M#H2{Xm*K(Q7 zA#ooRWCNS?Aayr(!5OeLh1gCwyT%GVMr|AC$Ga5lU z)8xuE3c>#mG>hsf)K{=4Wt7SXp^jey8+|U@1MJiT(L`cagYBBD84%ViNVt z$iDt1V@c-A0sRQ|KQo5B9MH>@tlq5ICYkj%;HP@Bp3OWJ_6wmN40xFnJr%s8Z+mx|I-ZWeyf*ynABbOt(i znWOG;&WffNvJIQrx5al}QJq(xggQim_4Y;8?6se3P*#MIS{h1#$Yf`uiS#5R?aDVI z{|@f>#xis$2$KgsnoHWO&upp8AN!uM3QlYhXE8^K$9e*H*p7AUL;(@c&5}-6P%(0hH0X ze^EwL0A&>IH)Yf(9z_`ihSEocP-pytCFLULtxkE%>sdjlEBb+@^SiaIJTOBjSGBCg z`^VTEKHfDTsHDBbN}~Pl`14@6?Npju5ua4hN8${G<1(c z(tTYoF?nwViI7{q$PK~S)|nm}g!kfEmW#vV5yW3FcOR`d6TQ%5+c&$4FB7=X;hJq) za{tug_y=Y5RbqZte{EmS)t$>K6lL_WQ%Opce~(Q0Sc`zhowHEx zSJkUIHb-_f8&NL%pN(1po*QaWi2O|%#r=yiT9o`hD5G4zDWfSU%BVV^jKa!kr0=yW zO}P=OJ^SO$5u>-_qB->!H$8e^#=rh2Wi*7nq_z`#d-)g+!oOE5gJHo?Kuxk5!UedwRphh2BP7NCDpATTSZS4h+Q?&N?I z^6`MGt{>~8mLgpbW2??Cm)hF_9Zn2Annlv}7mmmuVx~#P%FcoinSBB0jYlgpJ22^# z)G^C4`Hzq1>VRgP-S&%eGRZYn_p=O)pq>Z{WWp`p?>DnlyyO1#6IvuOW%t;!T{QHU zAv2%!QY{k5x>;6vSm>3;vT}bMcD6?ga+|6nS;27Z{y4FEhxfpd12Y-XpPKjiW0G~B zLr_{-t@uGxUJ^Hre(~+n?y$6{wwvrV>ZQ67k67$T1f==MT0RaRVK%R}qs7&RU~`w- z+rF7SkMkx?jw{*ZX4^<88vuwti%q_{?#wP2$&%|xw@BK&HLEa-Z~5y^n5sqv9@Zj& z-m7%MnZ>5dsY&3=YBJi;SCtBEDY`mOGI{)J{&Xr{Fm;lpRhO+5l&&E9b;Lu>WhdEyC1lP0xqIQeUXUrrh%%- zrkeJTzbT{O>1=HBn=)#}DDCeLYuGLG6+Si<=kIP+8BU3rO&|U<#vr(3M8*Qdh8&l! zXwFmZ#zX!SUD!eY;2LM7yn^%0NSW9nS!cKEyN?ZF#7Y8x^kzXO1i(0V@He(xDp}r2 z;0rirs5IgDN0;!QC)uYrg8=C$IO@Ere?~W}d}r3#CP-vpIqy+X^*?{+zhC@!1^&AN z|0h=9DOV6GY#kKXbQ3>ONlBn?y#k%>OVEwyJ3e8Rr9(}bz&y#R@7DcLl+zPLxCrsj z1ET@yg^`0l7%_lS@+&xI3k$7+Y&Zq;)L8Nc%30JD33xI+BGEO?{$=_UF7i5G102?36jmUN(NpO;YRUu#Sz<8*`R0qvwHiTWQ1+X>%RX8U=%M&GP_jz`TjkZS!+=(nn~lGW$;f4y?sD3zk^q*g zM`P!k`|syKmg(L1fBQh&1-Ue?MeGHWsn39AHbtfS>0eJh0wX)l0Z`Sqh}CC=>FVK^ z_~spe$~vdQ+`~~jrx>!xS)2^Kw!{RbX~Y@3F|vew?I_FIH+RleC~DO|gJ7kizLqIm zHz!ZH8ou8qC}`D?Tmc|m=c~$y4s-8Hl*m$lh{yH7Hjszv`lQyJB61mIh`w9e1dW?z za4{B!eG8L;wKr}npWYqB*brSCaUCcXjf z3qQPcV95mSi$xhyb-vv-)&_Bz!zh7tjgi0F;hs2unKJWCb{oMU5OjLlUwvUgW%_76 zBiC4In0H08XhdSCgLtjyvh2Ls^zXqe?N&wab&A|H+{;@PXlt!UzHt2%>fZXveiXJ= zufr05=*wjiiw2!l3M#E@WDL!@!u$ed?Bv%c)r`BbKu|oWjxKvT1=3jarrn<;IPO_d|_W--(NAgW>6-1e*4jJ6NL? z$yWV24oO5*f$ki0?jvGb+a!=>1l5`MjpXmwQk0W7q4N7Iqa3DWUqh+J`Av9o@3HAp z-Pl%pz&zqvv{rLmrr$XQH_%Xt`#Xx|3+D5mUlgV7$YlbU#4z5Ug?wZ;-(Ig>oM3)} z&-W=J$Zg4Y3&*(J-LZi(_L_~6MYpJ$btstx9gWL~I_q{vuj#A2ptp)-{Wh{ai) zLoc56B;vFelwd80hInclJE0>pT-MmjrI7T%=y9^3%i?sH5^lrW5Mp=D~NIk+eMvF3_W_AvJgY`#p6eDh!V}j6utsJzRj;!OuG|b>yQi}$ zKhTYktFH~r1NHfgq4a%D_=U(ULN>L;wanSO3|83NLQbGv3Z(rFmR(qaN5%o2HOu3V z(|qiC2#o9tn2B1o3cYk2A8o+2#*c^9gk+lBC~ZxxD&)VBinye|mu*v;40hyFYNp@WAuemY%XX2!Hz1 zP5VLf{gnHX%D2D#^{AcKkSRnX+I7_jK1v>C?j9uL70u9@!$s)n zfoppCS0XD61hahx>=r>$3jM8>GNBDrxEn5+{zG~C{YEjN9pX`J`LVoh3rx^T7%Zse z>v@BfYtJtoA0mO#Qb#Lut(vHX(-|Y&GGM{PEgRdvYj_mK_>(O9lzsf z@>I%P;Lb%gSMfk!n2z`^bUK8FHX?4?% zGwm=kZBf={M(8fY@xZaRgKR>0hELF?;5Ei~kbs0fs#({mVI@KD-k_3(xC1>h~U* zHvSfPmXwj@ zE_o;smFO!EBP>(8HbyxbERkhAweCplv8Utv895lHLbExbAKt^J6NiQ@6A7Ret;Ye9 zl7ajoq0`~0bz_pMl71igsLIt6I#?m{PE_3kxaG=pE=~kZ%N@(qhh_#*%wg*cx3Q%` z4B|}#)yh>nSxT0XCvTAvXIt*zB&cE!D6LFmoEfJp$#ItH@T+aKeBb`#^BZE z)E5UiuKt_SB1Jx$3*fn(7}zOMK)!8k&-Aq30MI>aZ|z<$iqF)-j;`lVVql@B ziuZqp%N}4WbcV)%V>Pxo@kGgz>zTA+vDiHd^9c#{snIC~ThX0maZ9fo51Mm)7GleJ zBt^t6f4#b~nJ+=c@LQY4djnm-$Uf5NBOi=cOm?{g z4rxRF(j{}wfRM+ez}5sNTb&9Amj`}^S`_G7H{<2Z2vi7JH1$f%1RWoGk$}Ek zNBRgtY5!~*zmj?C4PRaRz-+n$Z1M6Y4dR=Dbw-tWl;-_QsCBmD#SUss9TUqvH-YM$*nz)VQ5{~S$v~m}itnBj{m7#< zu7cG?Mq4bshTX6D#=E~>6?EjiyWle{uN~eXGqI2CCDQP9hyPN!BWoV}=HYpVZb1@9 z4!aRI1==r>Lmj1_!%ad`EwHkgLF}bO=ZWFfx zn1kCy_I_0`vDvHUh*IULUkRF0bQ$&f* z$2T89qSg68z9~q*JWtkzI9g7qiY2rLg-@mSt2sDXMZy%qD#eIH(^l~PHzG`+Fy!2` zjgFo*E@7?sT71al3d>TMHDvc3x#kSQ@AcD4#E=@ZTnU%G*lnpsBA+vN&|X}Y(6-=8 zOihIHn&B0DvoK>^pITi*Om!TA{b;C>O!*G)NNT#4ShL>fWad<|qRI6}x|5JHS?~Fs zFcuRVPj1nvv)ZQ#dDSDm-yDyNzI}IvAt!HLrl}yhz%lci&_U+zm%dnT@r)O#E;gq} zeccC3w^_2cST8j>ddtV@rgORZKOyrT|HKGJ3^PamgckSVAs?K2QMTg|7f%PTUaUfs>y>^^GW;+W z#{o!8ov=zL4q-!!K~3)VOtY#Z$^wJAo8bhT+_K+>5ECCMG}|v@T|e6{5bU{X#m{IM zw8wzLtfHoZ3sJ{JF4MKwzTMKac$blKCo|&}erhxkykJM$@$%-zKo)F`v(r$PBX-A8 z9o}=?T{|)oi&=H|wM}6z6L81@VdmfspA&dzjgDi?5$>Xo)yrb3(UMoW3_ zY`L1u(ovr+MSt~pr1YNF6^l6qd^(G5fRB!RAa=T^Ai8?QEi;_gkH6w>L4g5VjrvOZ z4%!2~MA>P|9BkaR4^wPM4OJZ<^}5)y@dm2)TXGi^u7_5tG7T|iC`KD`7&$$9W|(;R zYm0GVSd;I-Z1Fx3tlTc{rM6{caW*izPr?(4gq`WaR?R0~4Ikw>l)@16hTmqs^FPo= zP+cwR3ePl;rB4~EeOoOI=5;t2`$9zQp8VGa^F80LQE&OuZ0>o?!)DclCMhGr%Vg|e zopHtwwLxhs_6*UrX;NKib%Pad8okz0?Vb;Lz$R3v#ac?egTrCdnO6P7dV?WLeM*n5 z2Vunh!~n-6B-zIJ*yt{alc$e^khOkmV5h4hXCsEcW{0j-EuG?HQZrCEzQ zAV_x$0@5Wd-QB5xfJo<}OOfs_MMdN}m)CXQ+w0!%ct1Vk9b>;^kHLqfz+%mF&Uwxw z{{Q1gcTLir^GW#ucEuo12joNc6aJu4T;G)GkDvBG6)s$LWaK}6RQz# zl0gdkbJOy_Tb?^nLCq;ATl^`?qQ{3Yv*djlO%jtA%0rTQALh?wX1$+DQPE|{ss-+N#gZSDFngUZ3*oGSIL;$D2Mx0Wxr zSGakAu5d?zD4!F@vnn>woZ2^ofo4qgT47jOhwySo0Y>-W690$wKWV6LPV0 zxd);Z$OieO9jNl-ClrWv!)VD(+CPH#U3k%~BZqi&Dt~lrvl;1)+p7s0kr8Tj_kc#@ zww)P?dy?cwhUAliG*pe<+RWn$;kh@BiHm!5nEOR53whO?B5h11)p)K`E2Wq+Ly5dW zUV3a4hJBIJ<87JuloKm$9dlggGL_8e-)AK6Z@Do-66YW)LE(EF({;}kt)XW}T-Uv& ziqK**;#PJ-O3R$7^DWLwYt}@!8NF@aQj|!>*Idfl0p^utM3FZoOHK0Jp=5Fonu@|a zwntK(^zhRCj7fbd8siGw2G*a#b8ME#2~NY4_TV+{Yls~Nzdq5zCo!!XAbXq}Xr_DU z0B~hO0uqNF28RS!OQh*p0MA`ZNv56K2!;DJ7P5oJQ1o&z{s$t4XMbMXWQ$nnzK9X3 zpK8uGeh`9SaidLy`Z1V?>)X<*oUmta^^b&}S?|+7umT>*_}H+r`R->X)!Z)?f8&^T zUIA;Q$rH@xjU9DKkul!sPe+Pt!+Az+M9QwQGf^%osX9y&oKI_@wti!xwXeY`vNtx3RpTrakOR5#p7#z!NRFBJBQXmUq?20eusSr8Q4)svH zvdiA0&82W}h(%6maId}A<$i1%y9jq% z5l8zTjWu%BC(iJ-_)z0hOp>L9s`x~bT*T4bSHHiGcAp zf^_R>U+-48#P60nvwLNW9`DC{y!T&s_-ORA~iRy{A@HJ)fPR1385xtuTb z#o1GUG6ymh20mc9=dWG|$760&sP!f9waoaNa0L^36!QDLbMf~V_~u8jPXc)dDw%)W z^Gd+KM`s(z>rhc(Ey^q<;c6UP4#~&ls-(apq0H{8(N%l~Q5f`Ea~n}1EZ-s|@6Sy3~prpm=BW zg5NjVcpl)kAC#s>EomNg(cb?!L?&*tl^q%oUI8<--F#^+{H z7&4`%w}z2w*ll8qeykfaevqi=ui1I<{Lv-hPT?$pO`60S9c~4<3<}__Yw5cT^S(P%WcKhW5OFM z?qD+W_lPyujZ_@aG-gs`|GbZ|J@)0GlV`*zr&7qL{iU7DV>*gmcM41TWS&E{l!t7*!z4a`S>xQl4@!B`77i3;r=a^ z8gqdc@RpYfF@{fm_|n$#U8pV80M7~W#v%GlRaSr@)uz)#P2V6+B|+@xaoXB>Npov6 zK8jaDX0s2LH|fYP;am-VcW<)g&^NoTA|nJ4?Uov!j^FZ%(4co)k3@T`U9?mM3qhs{ zRR2DiH)#1>=VrSl;e7G7lf3Xu2=oy|8LH>aHYj{6HP47*x3TnsNF-w~F9Rj-PRD%( zzMmOzk*j+|%>1IY`7q>>4`#fgd0tXh>r6kV!#A^D%a8iPl948Nz1eeK*awH?$^Fe1 zf>IwpoII8xJnM79S_GH0_)3{%!`}|EMJD}uIh=1HiRv+dhagq?o4A*C6%y|9yo(lL zt1c~B+FB3x<&_^7Wf)QT9l0o#?aUKUy(r~%!%!a2$chnC?hIiGaUhYGlyt1ym?HAM?_iN$-m6nFPpuXj3nn1dUmhd_#r+O-jsJ2m@ zCGa_Y_{bC1Hgk?*ZogSW>6K11L9h#@5F|#nS!QQ-qy-ZY+xjPIa^;^t3`T*@+Ve-y z5S!;KT@tTPb5e1Cp{Yb|)o56cpi6S;=3D2Bh|2lpUcLp*Mnb*9raUsDdKGdqMxgrn ze=hIm|D#WCrpI^&y3KX^4I9CCx4N}P-$7CR=patQfX$P1Ua7VN|C|tZzvXxQ*zEY}O-@_*=XT(wd;-%$C($d- zYQY-qwaOO%agZ$kZ(d5BZ8X3Qnt>rVqwa1Mu2<^KrD&VnDPfcv6iOen7FHrQ!)9PG z!n*{`*5ho?9bENJ(64>ITW#W80~NU(L(gz|OZ0`|uXOO=>Yk%v7`^92Hqi+S=2`@@ zAwS$g(1s`bp0g@sd9sa6WVBWaTEBt%`C@b~p!2V0w<%8c0`%n6JAs(`S6L$y0LF?V>6_=Vl`5v-E2V(8N z+rWPxOAuPU^ULNvK-n2fMEX4+?-%GLR-9vjtX)4f+%@zX<;4hKT!u-4VZ4m6iO|r{ z?o3{L02#8{_#zD2zak&InD)*f&HFq4r|?4vj#f~EVwVrM;?L(1C&r{ye!i;HO#P1q)5T~ zs8KT(pLXsa;CJWe(`7lvd!4OxJ>3~_8q+dJewnd(mT5UIxUxxNSq+4NN`Sc;&2#>! z#-!8G7w1)JjFwS9A$>MY-FkC)F*X9{^cXyYR}wE0joXJ1WEQmVg-K_Og;@YKRUj|c zI}!HVuc^qwUN-U!=GUaXrJ-DxwaZr*lF)B+qldWfLUqQ*GPrxwJzb*7ucDAJHp%ma zz9$(4Iq+rH&n-O@5GKOog#Xu9@UV2gMos~P1q`@3@FTtg+R8HTD}xSfT}dI4#K_hY zxhf)!^lDUAZbh@?q?PrjZbPSz%yon|TB;E_U!SU(M`r{-(@70w&U8hqB4~+1!b9sxA)Q4`wUAA4T@++R)xR zIa2OM`u7(De6TunoftQ)cPKr&NwXrY>=xs0}N+BjrP%Jduh(a}|VfT5l zg4yNHxFVshVD1_AA@o}(V#$Dw$v53%kr1h>CL9SbLIyL0e}5&%N|ZP4%{>a@N9ojU zO>p}>sBJTLp8UQ--XOwPtRN}Xh1Q@gqQ{l*DmS_~zoT59{d+#=3`T=Z)`;v&QU9+@ zEh<@j!)5}W15j$g+qD;alLh2zKB%4pI{w!u+eFKa7>)8?JQ2D!Me9dK|6T_0f&njB z9oRIb`twoMb$|)UF+;NK;B6JR7emTlpiOX#+Q3|zn0MMWP{16+GX^eA)-<*!1Jv={ zUI)aa0_Wkf_0pUH#hBh;vF>sC6el8vQ`c+Vc=CF_?tE-ii;$g3oz^zm$g(s z4R7>^Kq?`!{XTXY-yG7kk2V*JbHJi0y-pZrE`BHLmp*)3=C)DC%1*vrFt@~HE6nk) z`vBY!!3q*^%s6;ozpY#It)lKv=?iBoF7Byyaeqy?ICaZWGsFP*8ATU&0)`V+@*z(7`AKA=p3EJro^_=No!g; zl?4F9wp5L9`FZuGR!GC2uQKs0<`c_3?>s_H{JDsKU!{M&$bfq+b-TOaKFLy(1}vKB zTBXWSSBI-fX>loGJ$u5^az=#`KcS>zMUOw@r%^mua-^+#+z5qPG)LbfjUx>iJw~GF zSGWBxEl8Nri19Rgd|0+Pur!YK!k{Pftin_oW79%dZcAU_sD}Z;=OnsEeMUej-)n{7 z>!z#E2V|lxt}Pd8r9oQnGTZ;Uf50chOM!d$VhidX`W>=8Kni-!_xzxxQJE6|*+f>=>}X#EH_2F#uVmjO}mCCfft%bqeogjamFS!Y8~t z2y0?9)P2xYUy5BqTGe+!~dex(N!sDk5A2yU*82!g(6fYbMf~!qn%F#77%!9$v5r9H)({;kh zjjq+}_#=#t{(k>eFU+F$;R}dL-Y(#5Kk5L_Kijw2tv0Z@cJ3U+tLd#RF2jFr)XHWl zNa`d9GM9o+M^b=wPaF%ap3g2NEJMNT@8KOd@dK8H@6bg~jY3k|4MPva9e0#EkB#A~{o^b!3enAVm{+0kRi-O50q#?BHR8M> z5V(Wqql2|L*XsuqZ_Pf0^vHy`wE;Xq-OpX;&+VSdTVToyr5)gF0=4cu*SYg9GzS#f2IR#~hD{1q8_dNjV=mCQ1ET)Y?k^SR@gEwPsAU6aInclN;i)kN z0`)D9+8Ve*VBS6*3Ni3zG1a5@LJfY%bwD@fkx2P124YFD??o0r%mYtbHg@TMdowZW zS~t*#teVzOMuDW*6D(9R^V?VN!6$uX5cAsDi^L%R#QjI8Ehp1$In0}h@p9u&Zzk(~ zIQ1om!FY-VBlr8Zu)_!5OaR%O0#i3{0r+ff_-#gN@1M6D-fK8f^ZiJ}&ueJypw$b8 z%e*!c78=lWY-f1^gQ%Df%VN8t-~0gHO!I0u3O9TsqY}6S4pV^F?AHOQgadK4enX*v z@JdA7fpUfk_%Ca%V?0O84^Ai9{*&`A0tTSOn zYMCg-6T5b%uKxz86|={&)is7_Bq{)1^Nk*H3CJDm!bCrEI#|e9^-ap7^AZsW{ShvK z!@!G#>$Lyk1}K6bJN>WUycUVoKyQuE7YsW@36Q?lk6L4h!3Szf3TFJAcHj=%bLKE= zRW}Y0djS@flR*OBDr%%VJy4j!zyB<%&j;{t8#{XvdHIS3H=Y`?9sDMWuUmGNqyGfi z#U{e$1Nach8YmW}hyKdS;y3oY27To+y+_A z)s&pPgUm(LmUgDkUx2TP@CX0AHG6O*pjLSp<{rP_80VH?liY)uAS-yOn{dvW3L?sA^Ql;uF|x+{&!O{T5@ z3FcJwe9vJ-lSg4P+X~p4WvV%fBXLOvX{hX&_bRyAwLhfOWPOe?ifPvlkWAs$QFvx+ z@DhVoi06sWKW|~YljWWxFzF|iG_N{*lq8O7xez*JjEwO>Pa~K8fHhmr4Hxo3Eou#e z)^$hXKs}z@1G^BdB>S!~w2k=lDaO7jpdN39arIDy7h7E75mGk3!BPl&QD3et=Aif6 zmzi6mNVDveGj3sez{=0bI_H+)AZQ=)&ol7&FR~^mF7&}{nPn%gM@z(yX7_&b&ui!G zibSch1W~Y|`wMnltWXK455-qFh0#YipnRy1JitT*WKDe1rY^4z%f~nPg-Oq)LMdZT zS!b87_Gf~z@#Ie1581JnGGE5_D99;~J`{FFiaWUuQ!)XdrU9$A8i3J_T$lt6;%XTBx{ho|h1$J(s-?JKOW zZywVevG+L0B9yzmnP*fU192K-O(-#WiUwFfD?{9h&+&A`HxpaiZn`!v)rD97cxsus z{bkCmt8yP@dz;T;A)^L30&%YX3ONNyG!-W-R90BRNCS`QnuFftQf*5fu!{ICJ}Wid z5(|;Qf0sbqFsu**W)4V~;(p!-V$znNZ?If=SM4le45}!{| z+vGm^iNqOA#RpuO7Q}dyYR24;IAVx;487ABYs|@Ss%BtdP3;1|(;wu;&@DBz(Vj19 z7~GTqtT{qzF^d5oLzMIztckJRL(QV_f@Xq}=uVa#%`!<7y`iSWn(yM#y-EPq?5CSv ztVibN6G^$hqMX*zP}3=54|_sl?|GVP<1S}5AS8OM#S(AfCu`FhAQuWvtE9^)rx|MV z74s{R7M;kul?t=WbR?s(KmL5!GokcI6G9VKDDscP;|z{^OyxJ^;ktj@I1>AiS?fhE zar=BhPdQHK;kPhm�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 EX|!PERlqSkp4LvFX-c$04VTpfc(t? z=}w4>X|F%@BX|@7Hj_UO{tUvOneZnH{zSo_DEJcvf1=<|6#R*TKT+@}3jRdFpD6ef z1%IO8PZa!#fw;7=5QDA;r|A!m#f{y+4KAWa}hzli%8&-4H4 z7ICrt?`{zn``_InC2~%3R#8ar#u3us`KR-vCN1`VZ0V5y-qNYj_SC_aeUi&uLES6@ zTO9mRVjnghODrm%ToWTD9u`Y38c}p`+9f;C8Xr?d`ATC@{5?!K>9^`Ivm2%-;{}D; zVQ|EZpB(7#)_-39JfFIpobEWizneaphRRo`(x7)$HH5m@xgBo{$Cyq|)<7%4o(X`P zfoC$I$Em>STv@S!T04{3tUEqd^vCdAHbBrfzWs%`A3?*22_?gnJdIH$;f?VG3W^nv zA^8?6{#|@)ZcZJ!GtnTt90B#ynXsr} z^P#0w;JoYS&CL4sm4;Ot^{~YD<=J>VBh~h%4b%` z7)9oi&^l_Py8ooO6y`d|bOeisdD>z%u-Y3*s-q^lUrA!7;>;@Dz1x&{AQ0xUA z5`{=nVFVwf?UOmTLwyUlGUSAuWLibbgKbnEn)&DwHW7ccmSFYO|9mbv7i=*)58b;5 z*H|ozVK45GKORB16~JzyC8;LVXK#^wz(e_(c+`#NA{-;!R6s|slp}jICtiD}f_!c; zG)2x5Mht&ALi39}cDOalVbC!aBG);w=sJDEWvE?XiL8ct_{uZy2$}*@jDhtA?g#-F zdgG%2O5xx$$-QevSFTg|_fVQK(;XF8YToRl@T|>%HeoWU?HMCz4dU)P!w`Vd3rlt3c7!o-R^AH> zdo23iD1H}xS8PYf;Ks>~Xbj4?<~E*WDkXGIYBtao?bpJ>%eiZ!X>Ik{K0A~p2ezf? zgi18&GpAq1))pct+tEak9uipkfyX1$W^@ggE11=Y&h^_moG%gic0$lAb;n?bxUq!vK0z@+;fi=E5bs= zAG&>V@C6y_{0W5xl-JbK{S%DqkUE2N3Md%ZM~@y!ce|>FL9g_nbbo2>c10sR(-(mE zchjV7X*8K3Q$nHs&NUO@l+4cdc&QiKY6q<|Ko|ku)C49R8j&1MA*@OXX}Jk&68^H+ zOa*DYPp%$KBVfwp=?da&=pQ23JTOXupL!*o;ntx%Ki}=cyccElLcYU-cUNi&iPLvrkEfzI{<<6@Yu~gVGD|JQfgV`1EGXMRo5Q>Q& z0ddoy0UOKkh*`Y`6Sle;ay>^iOw|xkJ>K`?I#W^|^lNCkZKmv?j$SSj5Ga(sc->IO zq1vDM&!z64y#|7bH(SOs3W*G389UNg@ul&NGEK52#Yl56=S1fSzjJ#ed`uj(;9ku= zdh}@+$CcZg#hcKZ${YO__Fc}p>`9Rd{V90M_Z2g3-1HiKdEjRtci z++q%ql48kt#n1xM0m}jVf#w0Wov>n>mHcJV(9B>nZ!>Q5i)OqJmU{R#d9~85WshgD z_g1fluH<|k{Y3dm_Om55H8mx*Zpnf{6Q>=I7t^ci2R*9gNem?V(QMqBwM!BEnj}SD)5v{N?PQx;p zGBN9(Y0Dfk!_3+o7Gv%54v|*9oA?vv4I#nQ+$^JLquh@iU4}kizvUjNUmaf!Tn*jP z-06Q)-uG-|OXZ4sj|Iq7FU)gHJqY7bk5FOZSK)WzdkC5duZRwaeTZlY@rbmD$+(V8 z%pLgO`sYj-^?e-a9(&*!cffHqWG{49+C0`J-6i&% zahrDg2W?wK(wIfkDs7g+box~^H^H&6-m`XxtM1u1>4l|Ar7opzimjPO9LJoT&!gDX z(_gUhTP~STbE9*==Qg%~J=wVyXo+b<(WGPVvc5$)5IQDro;>dio>F z>dE5{+K#eoscV=Yls|layh2k5BM;L>Ye8Ek9g8&>AsLB@)y`I-W2LK5Z<)8WURYhz z{n9!6&JV>l`jp@{{R4Ze0Rf9Z8cdo`TA2B&dC>@7+zX-~X4zA13occ|Iixp3ixXVS z9$ANm&;42v9fus59qZO})+J9CPnHGK$v%@I3uX!$`S87x6L{|Z@!HH=@#?OxYVokC zHLi88qpxFaWSDNFZ1^kQvOn>J;jrLW`3ux@!@XC7H$i!=#@(NUdU}2u-n-p<-U^dC z2^(>|Ui&@`RRv|*o9Z7cqGaN;sT@Emnkw3#{~=$xZ>eu<^SDphE4I_&qvOXYjAabV z(Y|<3U*QMehX@s>XOzuM&CCkIOzhQ+N1|<-URqv$UQWT!)MmGzK4O%zYkrt?%F zd~W%W9K}G((D?tc_m)9%b$h=c?iSo7XmEFe1qj}_1b26LC%C&yaJS&@7Th7YYtW#x zdCocSeecYzn)xzQHC6XhS9h=8z1P~SSMT-zS>nF3l!fB)-CSp>zS5%XnbfruoopM= zgpcM{!}Y9e(Se*Guc&E=-QcT}qKCs{)s1{Fu6|_=lW43$!Zh7>#6m=NMBsqsz_Z^4c$F2#a~75BNVJFg?06epX}u>72dSK5$Juc`)(24ooAqHrF}twl_XlJK`hu znU;)hX8psx!Q%G(fNiJrYt@hb3L^!{gZmG^7gH=!Xr*mmHsAX8DId_6m)_p3T?e*OE|1@E3&~a8$R3}!qx6qo+PtJRkN2t11r8O7X zGniU0uW+51RPgC;Y1Fz4cz1YsOBg#DU&CY|({Xu~#jCEDpp(;EJwbRpe<(#f7=yhgobEd`^)l>ejPK{c}{c`nD*Tx!7W3{uOt8X9p zDkKN22J9Gq+#pX>hwMyI^nT+0ohSxMW7ES=LVo_c%V_dsiLw}cVr~0KpNie3?yLMA zZ)!|x4>^;pQ>(0LkNdeqrA2x9&+9H!$Kx%(dwuzwlU?r~TKpU(CZDndo%}uXj`HsZ z2BmdUP+re(pL#eing+){r({$==$M<6{PsDun3_*m6sdl3(YAZpj*{eBv8CE*_oh2j z9kRYUD|U6bXn!u)jCpN~IFCC|T3_tYz3RRZKJz7ft1s?r+d1r;3QZv%5NuujbnNw7 zeEdsZn=&RXhAvy3ztr>i_2#Rq+kKL$QjW8L8vn(`rx)pq>U10wCX{EQ=ldTUpE|Ue zl9*t17(A_?J%$K=aaDTPdZTXacbxgE-EBO)Orox#nhH|+dd&zvVeBdGnGXG8(9Q2$ zBN!&Y1;HhWOz40Gsw?f>bD#8A8$A>q%v_fEEor8ZQal54dD$^|h zW#$K2t9_6IrpI*ZQqxBcPug@0-vf4giF*`FmQFj{rwxe~f^H+bfr`}53F$Wj(QUfd zE%Y|%@BeFcQ)3GSjM@Y_n+e{Wm0#_7S2DN!v{$VE!TO0wa>(}|`rH4^kNamE^S<9< zW8voh&whuU>)-pGZvcBuR8&OY(b$OepG}Y=srG*waj^X_Hbw0J+7$gS$ZY?oosYF6 z0SDS^m2T}vYwyMWgM@Rrdjk_GGgdStC9Sr^G@VcrnVH^xA&iH&3ONs_CMM`1=2y~_ zJ>s*^zs{u|zdAmCO*n83S9MKv>1xA5{Sh{){rgn`3ri(=E?w2~(Lpl!+ej4cZ2Dl* zNWX(@!rn}5{vL-IYtde{Q|IaBJ&ck@(qTisebxdo=!zKo3Rz6dY9gQJ*80!x$#v?+ z%%2S3<*!H;3*wZNZH8PQO?f!OvrqLO1-_e)nhicPnQ7v%tA1j8vr~mFa<2(DKcxsL z7(YB z%mCsF&ef}NtqB~ay=kQjftBMZ67{nN!t&_lkJt}866s7r7TV;AB!7Qp)V{H8)0`%P z*JPl5cuf6OI}QI?0D`}J+8}|miew;P^nhL9i`b8uk0a~{F^X-8UkE2-zEgVo zmNV>Q`8Q#xoBgx1c*Jn`qqs;FIg%uOh&wY5!yr$A(N~uYolx_#vR1j#^GgDnnl$Ac zq$&TRGSzfjnLBPG(z+sQJ?I0hM`2iyKXeqou`XA{(CgsCDOB-B^IB848f@8 zb85&u3h0Z_^dC1PBfGk&fUF0INsW3phL32TpKnd{TcX-cnF-o(#|=LA9P}9BpGn-3zqBrrj^ zKjbc<|6|S0Vy@4$7TK(AwtThxbCwZQ+)<`SQYb1KDZe+PK-#Nhj7fp`i6;pQ?16W` z3W`i~w|s0sHL7;8@rBsPJsQ7WIMz2wd)09#PdM)n>%EF4&h-9W`PhAw7vjV!Ek>T9z zW(*G2BtJSmMe{PQ;I%DPE*YqRl;}Huomt!UNHRXHxJg7$u2F}kFKar^*9jNZHfn0V z&wm&9kk?;(Gfw#BGbLQKHB|=$4xh8Lv?|zmpR)E1Ub&XMkkJ0G1s;y~CF&nSFbf;Y zf30P#|7|V%7ylRZ57`%_@9@sgeP8MTX0W2Mqph=pp|K+=2gko&5w!)#y*5t33;%8+ zYiwk$FJkM4@a?^3#L2=+%EiN~{l579n~?m^C*QySop}s$ur*XNb|MAVS4~ z1~88QAsPeqqkkSn|NSUQs!jUeDaP*~7jS{_akT&NpWlxqY0XB;@lK>x z1UmBH`|=-h^?Rd#v#2@#ImG`%7Bx2yz3#ID;mv_-NW%$^6 z;px*AgZCF@VouXDr}2*GDckXa=s^FsW+Pzw!cj)RQEstr+clw!1_vQb3J2v+iUt)R z^uM3{-;IG@G+aBNr3QR&rqp!3IfnT2Jt~Da0rjsJAZT7p-!94pMzg{n?)e(XyJ!2w zUk`(AWlgKtJn?7Y4nv;bz7Lrz69^N2+wpyl0Ze|a(MP-h+2`wgweP!%I1}kr@a^DD zZ;+?!RoL|)QF<<*yH4~)_wB^@2gl3n#oKGTGSSZsk8;h6U>u!?0UX^5NwIHbbzXq+ zkear05~y`E01-QI25ed_rq{~W9 z904OnkZnQvwNBS>kA1F+rDF4S-}Y5}&tuacwiO~QFAk7)6MwVqXasre#z~kA2649c zq3~JVp5!#VT)e$>nJy#;SyDi-A;}ilH3OMH^LOexQBt^DNrBxC_8BT6V3UKtpE`bj z^FI)0?0R-^&H=(){=NsgK)_|7ybJH!&HI2XnNWR`Jir~P>ooJG4KP(gVfoCe4TWFQ z1_5cP%t3gDOA~|JIs46~<;RHvVU@lH#c#JASpuRQt*hCsT4^6I;|bFVItQxe>Uq)LS8BNAT>OQv0iIcjUyC+8xSwVs{qQE$~u`) zBMMW@^C`04a>XL)sLwAqv%U|ZzF>pEY!)Ho`z=RnxK`C~L5b8YxG- zwGvZes6du*f4j4NOYYs)OPk5+6A5kj*qBx`MW!xhVgj|0oo8D*ftVS8*Ts;sl zGO~7tLYaw?9W|@bEVInGNX)Az^UVcNl=}dt2OS)@zu%sG zVF%wXNnS-K@Tqb|p*vO!fSiqc2FPU2x_<&T0fy}4^?*siyF?$*!ir#JaLw(CArsqmgC|P+fyBeFfe2zX zHVd~0(7Q#J(qfmT?AukUVRWfS>lSn#6+Cgx+fB|Z2Jg>R8$LNJhY=JjVbprz>U(}9 zwM+Guns5c}OX=C|ZnlXqW5Y$Hfd{lFOgxGae4$;$cNeL7CS{{!pSn;NxZZFhBR!Q{ z-PbW+GS?M&qJ)K|rEW3ettKErX*S#}jWCal{E=x0tO&F%E`QDKC`zQrG>I6)r5z)H z*oxKhZMbB@N#ih)gBdr08Dz`EQmy77(g9~YNdWQ0U?qxBGm^CCe)Q-RSmk{{OMCR}3w3=D zw`kcB!P?D<_yMqPRz#ov))^w7n1@K5(}!)Hop=v??a&p{T)`@BCuj2X(4eWtHT+=m zTy3&LuhQ=5>Q`I73>|_Mn*!bHf4p5_c?y^uXyX}dMiC?733?i*qFC@NiE?C2&cmrc zJnY2$+-=X>pG?2DhPWL>?klAV5Fd;In=$swux?6&h7-cnuA*W_vrrTUtEi9QXDDMt zOGK0=rZ$I={Z^*>vLpCf5LEm-^alnRRn!RRG7=`Kj&RR{X&xL;|dovwK^wOEYgV2w0CRMN`=Q8KG9=laOtO%p1H{bfkz(5KiN~cK*qv zyjm0l>yS}v$iWl6&Dl3yUJvH?Jg@tL<^I>GZp#BO*K7T;;0$A=8o-xW^tEyXF-Vdf zzW3E~VT=~h5?PDoxrgrS%$Ug0!wol=!<GsCzFs?KaI07CDVZ;NVkL~U<)*x=PN>jSJ1mx=w z&7Y~lejlIjes=xnA#|D&#^dDn0y9*+72Rple^R6n)|#d1HfhW^%YP zIt};}G$%n0{Cw24*2v$N-30lHOqcw6f%xL-8Dg_4lS0hV-abe+_PMRw0K5kQBj%|s z_(IcZ6>TGkq+pZ_h;@iEi{#*7RyRd7Y`$GN@}BiC0v?p-HW9W^;+kEu{uA8nc1dg> z;W21C{svU7FrPt%l0DRX>o@zf#mfi|r$j69(ikLB|43!Rd~VJMv$x@eHxG@i#I&BS zh(zNb3CpGFKqN-Ct0gt>X?yMA)KfBssRI zRF-V~+1$X0U>dlu1G$hLeR{4HD&ig2To(B0U{=V^K8FeZEbZYu`li)NHmw}xzs2H27`+!SjK&a4dsXE9!q2FyuA3eoyU-sKMc$yq7_=`xM zip*}>@Uw*vC;@uFRUCmiu9TaD*c12f-&wlWGUD6SHm1$papA)Beh~>_hOFKMMpfHi z@bg6s?oj3NG;zK#iu&Z1-F@6^jlg8FfJc*4%@PS&kCpnA)vu&}rexEdlotmzNMn78 zZF%XR1KbKv#}z;n;2)QGALAS(4%4w`SlnA?ULMJ26|ah17;ohI6Q703vSTkrn?N@$uUzE0!c-YY zU8aM3Xaj6WuV$7gyl%{GN>rzh!_Y?-@uj?vw3-xMO2yT}gdiOzU+t{6pduw$D!$X! zm;A&7Mm%Z*>9oSPyoo2+97gBWP2-DBBr&&7FtJnB{-i^yTRo_&_f6c(IFGnGM5cLx z4b37(E{a-M=Toxg1g_1CA*98wGocMT5=r^`P^eu7-jrcfF0El%{sUpotRbX=pY2ekEwmd%Ob=)+ovKu%V=1R!URV z(F4(GUN87l?#4nwnuWr(AHHYFC$A5LPzF^-&;3MsJ+N%FS!f~8qwO9}J=IjuMfFn( zAUec(`mylz0{)qa<6k)yMk9UZgxGL|GgDf>bOsAib6CAgQX_LXB5c$#$I2gcnsSx# zms2Cl(CZ(0bxHNG%V72?WM*+;_Uy(>x=TWM%XCiLt&s-#C+QGm>ZkBpg&6i(>p&A1 zxOTwqq>l&B#Z2VJRlMc+F}X245A9CxP|<7yHrWKZM0CaKWD4Ubrb1YG>3lPcR{lHz z$d@|}arGBlh>%_+KttRc57}@K_Sw2_uAyxf9<``1Ma0nUf<~ zc9*~Ctk8`Gqo_K~pBiW^Y{NOdRIT)SeU-DBkmdR(tPtM;_7$`JinhV>G>yX&_{A2~ z&~(n2s|I%yQOe?rVH2uPbXrDwq=?pBw%X++q<*jbf`B{=33Zu2Kxm)y8qJ(Bf+ z)apD$<;JoXALot8+>Lqsoy4g(Im->c&CmENH8>^}f=*sapuUbyHm+d38L5 z*mzewqfO`{pdljge*aKo{pT2Z{iu2g7xIKiN9ZC@+M z^?ZM!3lhw^UD+W2BxepiMRhijpF~o`p)s1lMcE1oZNH9Z>piSPlDjp_k1^M?BZqPe%>NLoPyM=1gKkDg~`2AOGd zBAC_UVk+S$f8atoB&ljaM9u`mBK8`F?rdQW64IT0vX%nD@>17UsC8<(eby zke~gg`Ra~N94Ek7GlN<6ODFCpwZ1ICFH&Lww*!rCtc|~-lZf&#M^~^(QqzJt4R6(L z*a$olQ!H(W?KUYUTC#M6ysBGT9#`nvEk35i1=k@dx1AAjv9og|q$CTPv*3ALn4)J)J{?eO$Zl#;V}9*KBj$9D?=C%T}r5oLtw*2z*x7tDQn_0w$nr%8K{}s`e&#a zOrr1xL_!nNc?UlsREofr@kZz`H*tNg99N#HifL*W}^O)xR92g(wPrBaliXm z7vng^xUl!mlHf%IiMo=&+R#HRjES^K2si@?hb;wETB|$=7PgRAlu$&g-D;o@v|X zLh5=JgsBJ>#12!dwP5eMpOWVid3j-h^fT{rq48Pn zJh_H1zrK9T6`cI(3LP@E^p)xpis4+4O9Cf7=5Ia?F6pn;k+g_J99z66wV;z7)VU&B zrx8J}24#Au(;z-b55n>(yCEFT;mH&Mja3oNNINbtTLnk_I?W3z-4$FI?27pT_hc*mAnSZ_kUqi$)1BQK;|X)RlLN4l?CRjHxjp?APxGj=+a*1 zM4scGC&j(?ez~Az&kUiTVG1XTU%ROt3&ST%>Pq~E?FIvdMdQ2{zn@6IX3JaiI|i&+ zC1@5YGH1(hXbk)K2Dho!;=?$$euc)M>=!Lvsws)L;rXN3J4L9p*i?`!E=cF0;<0lB zCNMq-!-X1jCbp=}oN)k-w@P>fCWZlV3dUPUKuR8!;G%2Spl*$nNcv+Q-CG*tH)3Fz z$_JB6>gs)EGDcFoP3#{OUf^MF`xRyVE7(Yp79|D8!6p?_J^XS`cALqs(DX&Q{REV! zgsadr)dVrD2FNG4>0fM@y@~t)Z@&7QqIC2y;@1*`&S6s)aplU->36o+Qs|rlX~NA8 zUv;m|b`Wt)P$C(cKTnOXq!pDfh&doAT4uV4Ej!;tTupJ$*%)7oJNwt(Zfjv99g?ec z>XeCO*| z>gx7b5M?mMp$jzJp*l8ZIyPNccg32i&oq)JSd^+XEAHe#@C+>dGP{4Afy3PP8To^uCj9T~or3o&rSaxS_Z zwMVs+_=}`=o0p>_&I#Sh17(oCS6+YRzZNjKs(W6+D#>mL3*Ttt!Zw;}b*XCi7qe&1 z7o{mAkrxK_e4uTskt1cy=PMr4ALo68rb)vhxr?!h7^Bm9$rTG)e8lo5Xg6*Ce{#L^tFMdx4jVw&C562?=(MDkwei&)ORllO{Azo4ONk6q@*d*VXr86 zaM)25#+zEpJXAv3l=pu}tzrGMYLkmMUu&d{gR8;>IUN`?UnCuNs7pAXeAS*GI7P07 zO@r3&gKnduQjcQIn}~&eImM3MQN*U2g}}B02W#!3?$;#osr6x%&fq3DOK!gMa|ALf zDC~7IjDs$Ba;XM{9f@@oUZeDv54ABvKF4lIL>qBfU(a~`v{E^3Yin!G@1)RY~jD z=*RAod~I9bZ0%C@uC_VlW`dqMRGdg|Z=}(_@YS$e386`-% z>>X$$j@oQ~OK1NOcI`GTvFEGRgosR5SI@wBtZmO`u?+b%EvLO8q;Bc!i94>nMc@_G zG9Aeuim~KeCvWHjDhHB;c_;KyQ$Eo&;vw1!yyD`CKds<=9WVf|KWpxLrQMV&_1{ll zLMvg(#aq7Y8KtdW8-eiTcNr0ul365PiC?2-_O4{r;n2D5q?k1Wp1o zRMMbsDCWo8x7n??1`2S8FY#LZ5GR%CygCbIX;)pIMpc?i$iEgqunQ4&<&2nk@`3jY z#4Iw=oK|``LfJ&&nl9#5U2~oDyxrm5tPSczOjNlZL9?3m5dE(8z}-G6S_dxSoZcY_ zbagI?x{qU2rnv(7jGVvs^;H)vlA3(T39=a?9U}S+qVMF#h}ld5|0QQq(OB;SwIFy9 zGT&O{$FIul<%Y^z7=+lA^UbIoHBwbal^F; zQq24rr(G`*qBFyX*;wYeSasbAG~!9?!RUEh(Ri}8K@(KrYUz*xI^3v}P0>9E*VS~Q z%VhS-#W;94@Z$*SA$m`0?_zrvq1s$gp7CVi@d~|o5qkZ^0+=Ij&04v53gQ%KwofK( znJ%A}6N5x`ru80BAZL+xP*ss7S-+TY&oPTXAb~a?$|lpG9rd*Woc&~&Vc3~6kIm?sA!Ohir*0@RjC7s39&L-IP4o| z-)el~FGDkYn>%$$PUL|XsYDTEWgkCW_%a`IH~6>?1u+>RpC!4kC>>f|Ck#y!;Js*?Bd;q z(5sEziohz1T}}kyvT=Nk=-BAXiTX4RaQrlyE$&{KBLhd3Y*KTP)mCgYsu!KkDH=- zYtmV|cq3v_Ac>Ww5^cLSJD^f~qLE`(xWIKsmu2~M&888>Y`9|?%u3!WR zOJ;~>QRj^%wXKEC-YR#ooi>`xjBV1ZGA8`hn{>&H-yYds^WTyP)kq=G7|uUUfq1Cc zsjr`ZAF@}*&7wGt+QT$X;OV7}*6O%anNBrvQcpJqc>Hy>7AH4Gg(&BPAf(yL$6h>F z)f0X|)o8|JdA8-?HEM*ICN@SVVeiI3Y%KBZuV68ayi!88b^ChUJ57T`-mVO1rxrlu zzk&(xsD=W2q-b30CSX@QC_=ofah`oRXwKh$X7BHP)l{j2-`qchC8leq(-9fd_>O3b z!`Y4D>h@fAJ>DM8m!z^dLx1d6V+rNrr)VK-hLHY{peg~yT_sp{RvB#^Iq|;{<^S(d z_5Gmkx0J5`4deg6MrF{OgnP%?e+k^L0m(e<2VVJ~|IM4|){N?gCGoObcV5)?zMbb< zvlA`SP6wi5+QIOj-_5x#oyXL_A-(}Lfr{&s-&kr|wM_=h`D=JW;(qfVya7Y+s+N6x zaRMJfz#M$?=}W~Is7`=nkOCMmXM3Kz1Bo^7Ugz(5H~`}R448qd=2zC1qJozIFirdH zJ(c~KUpL^NUd@y8J4MIC9FJZ-ScBET3;5hD+nQb=GSo1T(8H(AYOD4cf-RC$hQ!tu4GX{KlpT{o?I3{0n z?S@r2Pak;=Xyzzl;XNh^XedEX?*tPxM5PZhKyr1)Sn@cjELNK;p*O*`HVZ#SDb92l zEom=;t3MY%!2V{%B4)DJu1N%oR&Wo*E}hklF_sCx%)~8zvlZxd-Ec1+z*N8U00b+# z=>q#%fO~qByStVG9J8TK!?d`K=BibF6cy&cDS-RZjjkjaj>A)D>P;O+y2V=)oc*qb ztNC!G=7`)qJA4it_*=rBw+-_8?U?wW5I zXh`gN%0iGkY;2UrE=aII;8(Cc($G^6U6?kJcr?z%l;?RNZUw8%yTx!4#lb0$O-jHv2I81+m-#BX`c*W|3pD1|Ir` z(yXMr;hRdGaRr76Q*Nk=@l-6sepk#8Nb?G8G+v&6o>$Yg&kHmJ^8}bB%ceOmKokJE zq|V_oK#7@NmK8w?WQgym-p4nuLIGLX&@v6j!+5>8Aa7d07%w}`%6{lRLo)6-E-R;s zD^cjZPQ{@`+(Qcp@5>`i`S6s%>Y#WC7>4)bx`>w8ufTJ>E_}1)Fo7n?LAh2N0&*^Tb?f^WRX27l9+g@OUm<^!$795QsD&s)m@Ph8K zRH6|rS#F)tZo~Z`uJl!T(NElT8NemGGl`w{(@a$f-~!nguqBYKWAb30O0OhWrwEM% zjtUdZx?>&fx>tWa=4a=)-%Ly3tug!Q;tSH~GawV-t)w2O{{|M!8WzJneh-Z24bKY| zqTA?vHX#A825?{6Jy(vuOnRNbnwLPDFT3F|#!wMcf;qLH;>^efv6%x*y>;dKTB0Hf zPI_!MOeY3B^!juZQX8>}7W!}*-2&}t`}A$pij*R2Gn}xI02oQ%Lh#%!54XfIG?uoCi>is3b8PR!=`h${#lqS5I^xl;U z8AC^KW@g94bARtvZI5m*qtY|KdEVvF9 z--fKI?5BsTQVk9#Wm6KF5`P+WagbS8tO%*EOR=Io0I(qmtzrV&-4<-Ok(b%V@dvha zd!)Ua*|IJwet^Se4DTov<=VX3+aWuJslQC}i}!?nd_hsc@YAG!l?qn)5$G55%H~IA zCxkha8C=L5^PrdSFW5F-?aB7JJi@y{P-}8Dw*XwCs5`;e4qUoedGM#pK2$C=mZKfV z%SR`x4)%lKN$wq_WS>Tkc&3sGo>wltNUUwQXt@cXC~vDndh8X~gH{xYn>X3oPqxl(KjzZOYP8|UqcvDnA+Rni4V zyUfaR_2>!9#N9DSyHy?D)`4iho_zNF0}MPe_Kc~$nxc3KISM%P=8Y~+)PC76qag+< z{Jjx_d^bI&WGkecVJ30W;Y17c65{u*1@Y7{A@^yNBUVCYQa>MG%-&Pz%+g$7Ehpf| zL$gA^E?{T@czakenwjO9H@Vcu``@?y5w`$#+)^NJ%WRLp0$Iq*rOJrB!x-Pt9s=Ad zK!d}AoP%Lb#j-K{WmjTKV10=){pYU|rJO;Y318&fV=GEUU#e0)=W3SNgR3vzM|v&D zNIex?2}^Iji%Sb$KcF(q4l)i~IrUVXGAT)cC3f@sE5_eHCc|m~J}{d2dGc74C)$9t zuB;9e!siU@MC?4L5NVZkS=0A}RfNfXKpcKd2L_gbM^bV9OQa_Hpe?GX2}!6nu46`3 zTZKrX9S%5ZeJ;Y>jg*T#u5!7dQfZ`@D5?9?>hD+8q?yfX{6hb~{hxZbDcEByB3r2q z=Ll@ux7^a%sYaM37KAv6SvapwR^3CHI&KtMjbkwhdZZ(zgK*7Ykh8&ji}spZF#8zw z4ROs*un=x75}5@Oqq}nsksAvnUKXMkcKLQcSk^{$!jO@5H_)x-Qffjd!v-&#I0^*_ z%dF?zO|82T8Hkg!Wd(mkszxiEi=HiW`QCMyA3?}N3ufD|v|IhFbmLQE67#Q__`IIz zIK1Y#6LitU?1AqCaN}44ENC7W9T|epOPY-O#CMQtjX}&&#bH<0Dfsf%Wof0UZd8`5 z}|Pdqx{q)84wcsl%$@r|oZ%ZPGaR7!&^QDoh8!KZ&{LZ*wZ^k=?t z5X9qXtN$6zYKfOfq^r#6NKU>%fv+ynJqOq4hp~M4;l%1QL-d0T#N^PRK%UbtB7nZ| z7vih)?*#Cs-Uy^9S!!e&HEXw^awB9>OO?FG+gG`yG+nn_BB6F{Fs=}$edq;mdh`rp zD5v`Q2v^kUUrsx;xiOxjss8?{!K`1tM+vdgRak*4^Yik}GF%NVIFp!Icosk92|gP6Ga&+sx;9nuxkDCG`OHH*RrBoD%o z_FS(Mf8LIyt~lYrUJfCQ#=wa7R)Ks3CU^C0Y!mT)sw8Db?hyQT8rry*pBw9e`BRf8 zB!)%tYy~633cZYrmkFA3b$Wg(@X-G5bqnO(6#3>j8~K!AjV`f*QE( zOPdtg3xbvBhR=#%f$hz;_214qd?7vSz7FNg5TfLF8#pOfA=HV2K`YYiY#mY0I|un{ zC~!&(>Jffps={Qr_nFrdW;AgAGj=u@#`#7eD*6LRI69b=uhk-a4J|tQ;Bj;|yxbvRbVSO_ z9Kw+)1nV61e3o$X26=@8{PDBNT>VLaEiks9mx8R2l*^+)0hz^w=jb z{CttK36bHAp8^b7>^&W9#WA1zz8Z~Ub@GYssQa}>LC~y5d@*6JlX`gB$ zCN_rw>2aq+Wc2DZEuj*mOQdDoSU;I%noU`1AAVzQN_bq2Mu|tzdec%QSYJ^>bu8Eq zCCZs`v%AOZA~Hym#Yr*{-@H}9gcCM`D6>A=>0|ISq33C>HV*b+q%mJz&MzXz8Cyk2 zJG=uT+)0rXZ?F%TGIfyzYg$EpWwa{7>$f{g9v={md3fNjmvO(Vm#m_1%;~(0!zHJo zU-Ay~(MK_-3gstvXx}E=Q%Y=;9RA^YY||#Oc(Z}bTsUNizB4UN>u}}o2XsVB;2G=xjWh=yqNgbY#9P0_Uoi9=Aa^WJBX=%a7ovWDG2>0bC zT>5czE4~=j66u-aeLKRDov*?&u4@VH9wf8*#7QmyoSSKowAazq;hNYlQY^|K^N{t= z#8!wX&iYj3Y8wr+eA^de%-7^g2^CU5wMQgmcl!Y5G7xoJardzeD1I%bKPqH24Icqy>K4oeFHI}v6+CF;1CO{e(p^lfgq-!OUbvu)|P}edMS3uJfKki>>aOR338l z^4CYxpYo105RFE%`VzHMweOR3R0r2sjgmE+4HlelCyWN6>2GR~@MV7K&tnEvNTf*_ zuguw8$;Ag15*-n2-bL`BZ(x4EPyA-$cs3m1Dj~R=bg+%`Xmb4hzXu;P@+aW9{277+ z$x@z*@f1# zp_o=)!W~2#t#rpYQs`Cvu|wx#!IKRi{Z=?1Qvl(RXg`sc5pMGpPn*MSUfF08%_TU@ zzhmy=`DPR;QtMj%uzfnCU*yObpU3-F^uXuk5TC{K$T;sf#LbDJ8mv(6;PHl=8rwqN z;oedYgd(fMF6WIuRyD1Y5*)Ko(?*stUv@Ad;w&fWu0W0)X-IPWMx9^DN0DygdO;Iq zkXIkYIjcdV7GIm@Y@?)O%i!$lV~>u&J}i_F9rL+;q^-G1lXkL$UN_Z(LYn`5 zeE*N2vdpvYPxgp~+FRD3;K^>Ge!7NyBbrMbVtlnQR0>fZiz7l4VdV?ilRl#LS>rO$ zipqV0s%nx@px=eTZ1-{FhjXc6BG_yjHzy#56mD@I3adNGi+Q--cp{%ml*t3_H3g!?};jGFPjj-vA{m#C&q z?*`+x3?uPlsdN#-#YUwYRUMWV*Hlv|9nHnE@QZAt;~rVV)yqrl}|Db5>${fV9WV%cM^$%`|ZcD*tl+oO49IvG6b;3Gywm;Lql5N^Mg zQhzU&#TpGw_W)Ylq^!P>_>4(oZD?3p@a?gObBIv0o3TsZcD##fg6=?cRQqA7GDn^v0wr9|Oy;MhL{ccIapWpPz$LVA71P z#1YP0N6W10Ko;edMaOjrWkyT?X%>0U0jhc(L;J#KziPO2wGuQ~}m%;MDdZ=V9e zUF=UPnQ(@G?o$xP);CV+)gpHNC_Rkuf}&T2)bXH^%rYxmiVtlIO|V>${dDSJK2^>= z=3_&-I;YSpC6)qCQ=kT^tV%SWHI@j*CN?j$q@xx6nqSjtyd;6O9=kPsHP<*uGt?bm zay=@--#$~@gg=!X5pHNg2~L!DsH&muBHNSqGzyDY4vw&R%Nh|uo68i+#>@$QWh%KJ zL`?Txva)x-w&5O(?!lpGPB2$)RkO|uEFfR*JD zIaTOv!cFHb#De-XtaYlXWY<6_Gq%Ovs&Xb40zwSuIO(m5?UGWHMoE9kmnoMt_mz$fY>m7Htb(k=e@F z=ci>NlyJYBRW_sr=U4JLoL1A;8r&9&(*eiK zf%r3o5PhWNJ7Rf8I8Sfefz%k�OR)J&w+`RN7`IaXsxU!h5l@>kEnr=CM_(ZP{l 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�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�N19HEj*B{cr9Ljxvy|}9M*n0WFDm0j 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�pqX66iYQ{u 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 + + + +KNN + + + + + + + + + + + + + + + + + + + + + + + +

+ + + + + + diff --git a/KNN.ipynb b/KNN.ipynb new file mode 100644 index 0000000..6897875 --- /dev/null +++ b/KNN.ipynb @@ -0,0 +1,3767 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "kvD4HBMi0ohY" + }, + "source": [ + "# Install Java, Spark, and Findspark\n", + "This installs Apache Spark 2.3.2, Java 8, and [Findspark](https://github.com/minrk/findspark), a library that makes it easy for Python to find Spark." + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "b3xI5hrK_p4l" + }, + "outputs": [], + "source": [ + "import os\n", + "import time\n", + "\n", + "# data science imports\n", + "import math\n", + "import numpy as np\n", + "import pandas as pd\n", + "from scipy.sparse import csr_matrix\n", + "from sklearn.neighbors import NearestNeighbors\n", + "\n", + "# utils import\n", + "#from fuzzywuzzy import fuzz\n", + "\n", + "# visualization imports\n", + "import seaborn as sns\n", + "import matplotlib.pyplot as plt\n", + "plt.style.use('ggplot')\n", + "\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "colab_type": "code", + "id": "7kI3tH14nyTG", + "outputId": "248d2da9-4802-4329-ae53-e0209b3682cd" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Drive already mounted at /content/gdrive; to attempt to forcibly remount, call drive.mount(\"/content/gdrive\", force_remount=True).\n" + ] + } + ], + "source": [ + "from google.colab import drive\n", + "drive.mount('/content/gdrive')" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "PacPhfuan_6r" + }, + "outputs": [], + "source": [ + "!cp /content/gdrive/My\\ Drive/MscsDs/msdchallenge/kaggle_visible_evaluation_triplets.txt ." + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "3q9GWx_2oFLS" + }, + "outputs": [], + "source": [ + "!cp -r /content/gdrive/My\\ Drive/MscsDs/MSongsDB-master/PythonSrc ." + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "pyiYETN8oQbG" + }, + "outputs": [], + "source": [ + "# ! cd /content/gdrive/My\\ Drive/MscsDs/ && tar -zxvf millionsongsubset_full.tar.gz" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "ffK91tW9CsRY" + }, + "outputs": [], + "source": [ + "import glob\n", + "files = glob.glob('/content/gdrive/My Drive/MscsDs/MillionSongSubset/data/A/*/*/*.h5')" + ] + }, + { + "cell_type": "code", + "execution_count": 142, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "colab_type": "code", + "id": "fIaxCm5UCwOV", + "outputId": "5acdf015-0adf-436b-edeb-9cc9908d1af3" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "7620" + ] + }, + "execution_count": 142, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "len(files)" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "YErj0Bh0MNVX" + }, + "outputs": [], + "source": [ + "import sys\n", + "sys.path.append('./PythonSrc')\n", + "\n", + "import hdf5_utils as HDF5\n", + "import hdf5_getters as g" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "aOn4Xxn_L5Bi" + }, + "outputs": [], + "source": [ + "artist_names = []\n", + "song_id = []\n", + "song_titles =[]\n", + "song_durations =[]\n", + "song_release_years =[] #year when this song was released, according to musicbrainz.org\n", + "song_hotness =[]\n", + "song_tempo = []\n", + "song_energies = []\n", + "song_danceability = []\n", + "song_bars =[]\n", + "song_beats = []\n", + "song_time_signatures =[]\n", + "song_tatum =[]\n", + "song_modes=[]\n", + "song_keys=[]\n", + "artist_familiarty = []\n", + "artist_hotness = []\n", + "\n", + "for f in files:\n", + " \n", + " h5 = HDF5.open_h5_file_read(f)\n", + " \n", + " song_idss = g.get_song_id(h5).decode('utf-8')\n", + " song_title = g.get_title(h5).decode('utf-8')\n", + " song_duration = g.get_duration(h5)\n", + " song_release_year = g.get_year(h5)\n", + " song_hot = g.get_song_hotttnesss (h5)\n", + " song_speed = g.get_tempo(h5)\n", + " song_energy = g.get_energy(h5)\n", + " artist_name = g.get_artist_name(h5).decode('utf-8')\n", + " song_dance = g.get_danceability(h5)\n", + " song_bar = g.get_bars_start(h5)\n", + " song_beat = g.get_beats_start(h5)\n", + " song_time_signature = g.get_time_signature(h5)\n", + " song_tat = g.get_tatums_start(h5)\n", + " song_mode = g.get_mode(h5)\n", + " song_key = g.get_key(h5)\n", + " artist_familar = g.get_artist_familiarity(h5)\n", + " artist_hot = g.get_artist_hotttnesss(h5)\n", + " \n", + " song_id.append(song_idss)\n", + " song_titles.append(song_title)\n", + " song_durations.append(song_duration)\n", + " song_release_years.append(song_release_year)\n", + " song_hotness.append(song_hot)\n", + " song_energies.append(song_energy)\n", + " song_tempo.append(song_speed)\n", + " artist_names.append(artist_name)\n", + " song_danceability.append(song_dance)\n", + " song_bars.append(song_bar)\n", + " song_beats.append(song_beat)\n", + " song_time_signatures.append(song_time_signature)\n", + " song_tatum.append(song_tat)\n", + " song_modes.append(song_mode)\n", + " song_keys.append(song_key)\n", + " artist_familiarty.append(artist_familar)\n", + " artist_hotness.append(artist_hot)\n", + " \n", + " h5.close()" + ] + }, + { + "cell_type": "code", + "execution_count": 145, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "colab_type": "code", + "id": "gkfv9QHdMj0j", + "outputId": "7a6e9771-f447-4973-d0d6-978993d2c18f" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'SODRPJT12AC468DEF1'" + ] + }, + "execution_count": 145, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "song_id[2]" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "uTTgOQEAMuLG" + }, + "outputs": [], + "source": [ + "data = {'song_ids':song_id\n", + " ,'song_titles':song_titles\n", + " ,'song_durations':song_durations\n", + " ,'song_realease_years':song_release_years\n", + " ,'artist_names':artist_names\n", + " ,'song_hotness':song_hotness\n", + " ,'song_tempo':song_tempo\n", + " ,'song_energies':song_energies\n", + " ,'song_danceability':song_danceability\n", + " ,'song_bars':song_bars\n", + " ,'song_beats':song_beats\n", + " ,'song_time_signatures':song_time_signatures\n", + " ,'song_tatum':song_tatum\n", + " ,'song_modes':song_modes\n", + " ,'song_keys':song_keys\n", + " ,'artist_familiarty':artist_familiarty\n", + " ,'artist_hotness':artist_hotness\n", + " }" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "JITTHxJmFGEW" + }, + "outputs": [], + "source": [ + "# To use the data loaded from hd5 files\n", + "# df=pd.DataFrame(data)\n", + "\n", + "# To save the data to csv files\n", + "# df.to_csv('/content/gdrive/My Drive/MscsDs/MillionSongSubset/msd.csv', sep=',')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "ypmO2LM4FCCm" + }, + "source": [ + "Loading the data from saved dataframe" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "YVR7uF2cMwhI" + }, + "outputs": [], + "source": [ + "df = pd.read_csv('/content/gdrive/My Drive/MscsDs/MillionSongSubset/msd.csv')" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 615 + }, + "colab_type": "code", + "id": "Jdsf1tJwFK1e", + "outputId": "83ec3a8b-4962-47a6-d524-39c5fb5eb044" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Unnamed: 0Unnamed: 0.1song_idssong_titlessong_durationssong_realease_yearsartist_namessong_hotnesssong_temposong_energiessong_danceabilitysong_barssong_beatssong_time_signaturessong_tatumsong_modessong_keysartist_familiartyartist_hotness
000SONHTWP12A8C142744Vals '89162.585670Manolis Famellos & I PodilatesNaN94.3010.00.0[ 1.45502 3.39383 5.32826 7.25953 9.1...[ 0.16441 0.80395 1.45502 2.09102 2.7...3[ 0.16441 0.48418 0.80395 1.13522 1.4...100.2287300.000000
111SOPIHMB12AC468E0DDGhost of the Ocean (Live)214.255870Uriah Heep0.2502149.9210.00.0[ 1.20218 2.80457 4.39266 5.98514 7.5...[ 0.38752 0.79653 1.20218 1.60244 2.0...4[ 0.2523 0.38752 0.52273 ... 212.97102 2...170.6732390.479205
222SODRPJT12AC468DEF1The frog song169.873830Alain-FrançoisNaN136.0440.00.0[ 1.37397 4.48312 7.56804 10.65675 13.7...[ 0.48609 0.93058 1.37397 1.81958 2.2...7[ 0.26328 0.48609 0.70778 0.93058 1.1...120.3803170.300918
333SOLLOTO12AB01804C6Deep Blue Sea (Daniel Rossen home recording)351.503222008Grizzly BearNaN85.0030.00.0[ 0.72449 3.55798 6.37712 9.20176 12.0...[ 0.72449 1.43405 2.1445 2.85228 3.5...4[1.8653000e-01 3.6881000e-01 5.4665000e-01 ......190.7606360.547244
444SOCNYGS12AB01832B8La vérité252.446892007Annie Blanchard0.0000113.2870.00.0[2.2334000e-01 2.3324800e+00 4.4484000e+00 6.5...[2.2334000e-01 7.5000000e-01 1.2775800e+00 1.8...4[2.2334000e-01 3.9890000e-01 5.7445000e-01 ......150.4797350.352460
\n", + "
" + ], + "text/plain": [ + " Unnamed: 0 Unnamed: 0.1 ... artist_familiarty artist_hotness\n", + "0 0 0 ... 0.228730 0.000000\n", + "1 1 1 ... 0.673239 0.479205\n", + "2 2 2 ... 0.380317 0.300918\n", + "3 3 3 ... 0.760636 0.547244\n", + "4 4 4 ... 0.479735 0.352460\n", + "\n", + "[5 rows x 19 columns]" + ] + }, + "execution_count": 5, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 204 + }, + "colab_type": "code", + "id": "xh9nsbK8FVlG", + "outputId": "3c30a51c-1611-4bd3-9877-c752340f193a" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
song_idssong_titlesartist_names
0SONHTWP12A8C142744Vals '89Manolis Famellos & I Podilates
1SOPIHMB12AC468E0DDGhost of the Ocean (Live)Uriah Heep
2SODRPJT12AC468DEF1The frog songAlain-François
3SOLLOTO12AB01804C6Deep Blue Sea (Daniel Rossen home recording)Grizzly Bear
4SOCNYGS12AB01832B8La véritéAnnie Blanchard
\n", + "
" + ], + "text/plain": [ + " song_ids ... artist_names\n", + "0 SONHTWP12A8C142744 ... Manolis Famellos & I Podilates\n", + "1 SOPIHMB12AC468E0DD ... Uriah Heep\n", + "2 SODRPJT12AC468DEF1 ... Alain-François\n", + "3 SOLLOTO12AB01804C6 ... Grizzly Bear\n", + "4 SOCNYGS12AB01832B8 ... Annie Blanchard\n", + "\n", + "[5 rows x 3 columns]" + ] + }, + "execution_count": 6, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "nd=df[['song_ids','song_titles','artist_names']]\n", + "nd.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 221 + }, + "colab_type": "code", + "id": "CxOwinTFsxZm", + "outputId": "4999d21f-1d11-41dd-937b-4402b1be5c5d" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "Intro 12\n", + "Hey Joe 5\n", + "Smile 5\n", + "Wave 4\n", + "Outro 4\n", + " ..\n", + "In The Midst 1\n", + "Provisoirement 1\n", + "Chanson sous la pluie 1\n", + "Tropical Nights 1\n", + "Jetstream - Arthur Baker Remix 1\n", + "Name: song_titles, Length: 7438, dtype: int64" + ] + }, + "execution_count": 7, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "nd['song_titles'].value_counts()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 204 + }, + "colab_type": "code", + "id": "MDD5vViroUvk", + "outputId": "5ee5b989-a016-4171-bfbd-2ec371cde691" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
user_idsong_idsplay_count
0fd50c4007b68a3737fe052d5a4f78ce8aa117f3dSOBONKR12A58A7A7E01
1fd50c4007b68a3737fe052d5a4f78ce8aa117f3dSOEGIYH12A6D4FC0E31
2fd50c4007b68a3737fe052d5a4f78ce8aa117f3dSOFLJQZ12A6D4FADA61
3fd50c4007b68a3737fe052d5a4f78ce8aa117f3dSOHTKMO12AB01843B01
4fd50c4007b68a3737fe052d5a4f78ce8aa117f3dSODQZCY12A6D4F9D111
\n", + "
" + ], + "text/plain": [ + " user_id song_ids play_count\n", + "0 fd50c4007b68a3737fe052d5a4f78ce8aa117f3d SOBONKR12A58A7A7E0 1\n", + "1 fd50c4007b68a3737fe052d5a4f78ce8aa117f3d SOEGIYH12A6D4FC0E3 1\n", + "2 fd50c4007b68a3737fe052d5a4f78ce8aa117f3d SOFLJQZ12A6D4FADA6 1\n", + "3 fd50c4007b68a3737fe052d5a4f78ce8aa117f3d SOHTKMO12AB01843B0 1\n", + "4 fd50c4007b68a3737fe052d5a4f78ce8aa117f3d SODQZCY12A6D4F9D11 1" + ] + }, + "execution_count": 9, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "users = pd.read_table('./kaggle_visible_evaluation_triplets.txt', sep='\\t', names= ['user_id','song_ids','play_count'])\n", + "users.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "colab_type": "code", + "id": "7coVw0cFs_NX", + "outputId": "d58f8bd4-dc32-4f22-fd43-b154e284d6bf" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "110000" + ] + }, + "execution_count": 10, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "uniqueUsers = users['user_id'].unique()\n", + "len(uniqueUsers)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "colab_type": "code", + "id": "Cd2oKsMffRiI", + "outputId": "0118da68-d80e-4314-9f02-7cdb6d832517" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "110000" + ] + }, + "execution_count": 11, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "users['user_id'].nunique()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 170 + }, + "colab_type": "code", + "id": "aRfWu6QRZNUe", + "outputId": "a699773e-6fca-48f6-d240-932b58064426" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "count 1.450933e+06\n", + "mean 3.187149e+00\n", + "std 7.051664e+00\n", + "min 1.000000e+00\n", + "25% 1.000000e+00\n", + "50% 1.000000e+00\n", + "75% 3.000000e+00\n", + "max 9.230000e+02\n", + "Name: play_count, dtype: float64" + ] + }, + "execution_count": 12, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "users[\"play_count\"].describe()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "colab_type": "code", + "id": "k-UVpkGkZdN3", + "outputId": "3af42207-b45f-4379-a4e4-fda9d4caf549" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "163206" + ] + }, + "execution_count": 13, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "users[\"song_ids\"].nunique()" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 419 + }, + "colab_type": "code", + "id": "APCO9cpjuJpJ", + "outputId": "6e27557e-c30f-475a-c089-58b03df31f84" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
user_idsong_idsplay_countsong_titlesartist_names
0c34670d9c1718361feb93068a853cead3c95b76aSOEHWGF12A6D4F8B2B3Hips Don't Lie (featuring Wyclef Jean)Shakira Featuring Wyclef Jean
1c759e740af57c477fe358e62ad7b3b1f2f113a2fSOEHWGF12A6D4F8B2B6Hips Don't Lie (featuring Wyclef Jean)Shakira Featuring Wyclef Jean
28f6e833948caf895a3281ded74ceb32783916e42SOEHWGF12A6D4F8B2B1Hips Don't Lie (featuring Wyclef Jean)Shakira Featuring Wyclef Jean
38cd07652ccba3754502c8fa8fe809c418fdcdc8fSOEHWGF12A6D4F8B2B2Hips Don't Lie (featuring Wyclef Jean)Shakira Featuring Wyclef Jean
4563e8088cbb8affb096d2334531624a8cf7ff3d2SOEHWGF12A6D4F8B2B5Hips Don't Lie (featuring Wyclef Jean)Shakira Featuring Wyclef Jean
..................
18127a4a85f48a7d787b6e17ed38001abcd032cb87c6aSOKLIMD12A8C145AC31Whiskey on the FireAaron Watson
1812890bac2ccc1660cf444569f3553e6b141d132b2c3SONCEJF12AB018581C1JammingTwinkle Twinkle Little Rock Star
1812946a363f17bd4e07d2c607779877baedafc07e7d7SOKWNWI12A8C13383F1Bianca's Midnight LullabyAl Di Meola
181308ecfca10c16f046ae53634347d6b9029c40425c0SONQKDG12A8C130D961IsabelJuana Molina
18131e43d36faeb14c6982e3721a6503ba8978edb9384SOAWDBP12A8C144CB22Diamond In The RoughSyl Johnson
\n", + "

18132 rows × 5 columns

\n", + "
" + ], + "text/plain": [ + " user_id ... artist_names\n", + "0 c34670d9c1718361feb93068a853cead3c95b76a ... Shakira Featuring Wyclef Jean\n", + "1 c759e740af57c477fe358e62ad7b3b1f2f113a2f ... Shakira Featuring Wyclef Jean\n", + "2 8f6e833948caf895a3281ded74ceb32783916e42 ... Shakira Featuring Wyclef Jean\n", + "3 8cd07652ccba3754502c8fa8fe809c418fdcdc8f ... Shakira Featuring Wyclef Jean\n", + "4 563e8088cbb8affb096d2334531624a8cf7ff3d2 ... Shakira Featuring Wyclef Jean\n", + "... ... ... ...\n", + "18127 a4a85f48a7d787b6e17ed38001abcd032cb87c6a ... Aaron Watson\n", + "18128 90bac2ccc1660cf444569f3553e6b141d132b2c3 ... Twinkle Twinkle Little Rock Star\n", + "18129 46a363f17bd4e07d2c607779877baedafc07e7d7 ... Al Di Meola\n", + "18130 8ecfca10c16f046ae53634347d6b9029c40425c0 ... Juana Molina\n", + "18131 e43d36faeb14c6982e3721a6503ba8978edb9384 ... Syl Johnson\n", + "\n", + "[18132 rows x 5 columns]" + ] + }, + "execution_count": 14, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "knnData = pd.merge(users, nd)\n", + "knnData" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "colab_type": "code", + "id": "3JXxpgtiXco5", + "outputId": "e124db67-bc22-46f6-ee04-f18a6437ddfa" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "16083" + ] + }, + "execution_count": 15, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "knnData[\"user_id\"].nunique()" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "colab_type": "code", + "id": "YQ3Lnd1FY5N0", + "outputId": "60757599-2f03-4aa9-ae81-0836a2372271" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "1311" + ] + }, + "execution_count": 16, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "knnData[\"song_ids\"].nunique()" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 170 + }, + "colab_type": "code", + "id": "aYbC1u8jY8M1", + "outputId": "dedc9fd2-95d7-475e-b5c3-7cc68944c09e" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "count 18132.000000\n", + "mean 2.999007\n", + "std 7.307306\n", + "min 1.000000\n", + "25% 1.000000\n", + "50% 1.000000\n", + "75% 3.000000\n", + "max 597.000000\n", + "Name: play_count, dtype: float64" + ] + }, + "execution_count": 17, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "knnData[\"play_count\"].describe()" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "L0v8ElmuwNGq" + }, + "outputs": [], + "source": [ + "song=knnData.drop_duplicates(['user_id','song_titles','artist_names'])\n", + "song=song.reset_index(drop=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 204 + }, + "colab_type": "code", + "id": "8jUcy5NXxXV3", + "outputId": "b2702b80-8e9b-496d-ba41-ec933f25734b" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
user_idsong_idsplay_countsong_titlesartist_names
0c34670d9c1718361feb93068a853cead3c95b76aSOEHWGF12A6D4F8B2B3Hips Don't Lie (featuring Wyclef Jean)Shakira Featuring Wyclef Jean
1c759e740af57c477fe358e62ad7b3b1f2f113a2fSOEHWGF12A6D4F8B2B6Hips Don't Lie (featuring Wyclef Jean)Shakira Featuring Wyclef Jean
28f6e833948caf895a3281ded74ceb32783916e42SOEHWGF12A6D4F8B2B1Hips Don't Lie (featuring Wyclef Jean)Shakira Featuring Wyclef Jean
38cd07652ccba3754502c8fa8fe809c418fdcdc8fSOEHWGF12A6D4F8B2B2Hips Don't Lie (featuring Wyclef Jean)Shakira Featuring Wyclef Jean
4563e8088cbb8affb096d2334531624a8cf7ff3d2SOEHWGF12A6D4F8B2B5Hips Don't Lie (featuring Wyclef Jean)Shakira Featuring Wyclef Jean
\n", + "
" + ], + "text/plain": [ + " user_id ... artist_names\n", + "0 c34670d9c1718361feb93068a853cead3c95b76a ... Shakira Featuring Wyclef Jean\n", + "1 c759e740af57c477fe358e62ad7b3b1f2f113a2f ... Shakira Featuring Wyclef Jean\n", + "2 8f6e833948caf895a3281ded74ceb32783916e42 ... Shakira Featuring Wyclef Jean\n", + "3 8cd07652ccba3754502c8fa8fe809c418fdcdc8f ... Shakira Featuring Wyclef Jean\n", + "4 563e8088cbb8affb096d2334531624a8cf7ff3d2 ... Shakira Featuring Wyclef Jean\n", + "\n", + "[5 rows x 5 columns]" + ] + }, + "execution_count": 19, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "song.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "colab_type": "code", + "id": "xvTgJrEHzjcT", + "outputId": "a6396832-0126-4a40-db72-15b7ee64e63a" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(16083, 1311)" + ] + }, + "execution_count": 20, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "song_pivot=song.pivot(index='user_id',columns='song_ids',values='play_count')\n", + "song_pivot=song_pivot.fillna(0)\n", + "song_pivot.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 284 + }, + "colab_type": "code", + "id": "rnSOlC-B8BVk", + "outputId": "95c362e7-178f-4a89-a791-990c1ec2717f" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
song_idsSOAAAQN12AB01856D3SOAAEHR12A6D4FB060SOAASSD12AB0181AA6SOABLAF12AB018E1D9SOABTKM12A8AE4721ESOABVWD12A58A7C3FFSOACEDS12A6701EAAASOACUIU12A6D4F715BSOADJND12A8C13BAE1SOAECHX12A6D4FC3D9SOAEEXM12A8C13D6E3SOAEGMV12A8C1455F2SOAEJTI12A8C145051SOAESFB12A8C13573FSOAFUPM12A6D4FD26FSOAGXBV12A6D4F70BDSOAGYNF12AB0187EEESOAHDOA12A6D4FA830SOAHRLX12A58A7C372SOAHYMX12AB0182021SOAIEMM12AB017EC98SOAIJKC12A8C131D6FSOAIOOJ12A8C1385D2SOAJEOO12A8C13A2FFSOAKDLX12A67ADAFC5SOAKODQ12A58A7B461SOAKPEL12A6D4FC126SOAMXYQ12AB017C25ESOANUME12A8C1368DFSOAOOXO12AF72A787FSOAOXTG12A67021AA7SOAPEEL12A81C21ADESOAPIHC12A6D4F5FD5SOAPLUZ12A6D4F9CD2SOAPQCG12AB017AAABSOAPZIG12A6D4F7920SOARSSE12A58A7BA9ASOASNQV12A8AE48819SOATHUP12A8C131DC3SOAUFFQ12A8C134623...SOZCURA12AF72A17B1SOZDDPQ12AF72A8BA8SOZEQVC12AC468E38BSOZFGOG12A58A7F755SOZFKKI12AB018602ASOZFZMX12AB018BE08SOZGQLE12AB018672CSOZGUEI12A8C139953SOZHSPI12A8C1339E6SOZIIHW12AB0189AFASOZIMLB12AF72AD1CDSOZKFHV12A6D4F996FSOZKYCJ12A6D4F480ASOZLSBK12A6D4F87B8SOZMELK12A8C143532SOZMHAO12A8C141C2ASOZMMFV12AB0183F74SOZNESJ12A6D4FD187SOZNQQQ12AF72ABF9FSOZPRDS12A8C134E2ESOZQDRV12A8C133FB1SOZQSGL12AF72A9145SOZQVTJ12A6701D96BSOZSHWZ12A8C1452B5SOZSKYN12A8C13A883SOZSSCO12AF72A554DSOZTOSX12AC468AD34SOZTUDR12A8C13FE3FSOZUEFV12A8C141169SOZUOAK12AB018AA82SOZVTZB12A58A7AEE4SOZVWSE12A6D4F7ADASOZVZWP12A58A7BAD1SOZWAMN12AB018234DSOZWECJ12A6D4F5229SOZXHBQ12AB0186626SOZYUKG12A6D4FB64FSOZZPYH12AB0187578SOZZQBH12A6D4FAFD8SOZZVMW12AB0183B52
user_id
00020fcd8b01986a6a85b896ccde6c49f35142ad0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
000724134199acaa98869fc4ffb805198d2940eb0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
0011d5f4fb02ff276763d385c3f2ded2b00ad94a0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
001a4329228373ec5d4efe1084317b4009df7b970.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
00200865ee578746cc29b28d2c14a81c74895a5f0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
\n", + "

5 rows × 1311 columns

\n", + "
" + ], + "text/plain": [ + "song_ids SOAAAQN12AB01856D3 ... SOZZVMW12AB0183B52\n", + "user_id ... \n", + "00020fcd8b01986a6a85b896ccde6c49f35142ad 0.0 ... 0.0\n", + "000724134199acaa98869fc4ffb805198d2940eb 0.0 ... 0.0\n", + "0011d5f4fb02ff276763d385c3f2ded2b00ad94a 0.0 ... 0.0\n", + "001a4329228373ec5d4efe1084317b4009df7b97 0.0 ... 0.0\n", + "00200865ee578746cc29b28d2c14a81c74895a5f 0.0 ... 0.0\n", + "\n", + "[5 rows x 1311 columns]" + ] + }, + "execution_count": 21, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "song_pivot.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "CR7Au1n-z4ZT" + }, + "outputs": [], + "source": [ + "from sklearn.neighbors import NearestNeighbors\n", + "knn=NearestNeighbors(n_neighbors=10,metric='cosine')\n", + "model_user=knn.fit(song_pivot)" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "e6Hk5lvIXxHZ" + }, + "outputs": [], + "source": [ + "# for i in range(0, len(distances.flatten())):\n", + "# if i == 0:\n", + "# print(\"Searching recommendation for user: \", song_pivot.index[query_index])\n", + "# else:\n", + "# rows = knnData.loc[knnData['user_id'] == song_pivot.index[indices.flatten()[i]] ]\n", + "# for item in rows.values: \n", + "# print(\"\\n User: \", item[0])\n", + "# print(\" Song: \", item[2]) \n", + "# print(\" Play Count: \", item[3])" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "__p8qcQ1XnoW" + }, + "outputs": [], + "source": [ + "def findRecomendationsUsers(model, matrix, data, query_index):\n", + " distances, indices = model.kneighbors([matrix.iloc[query_index, :]], n_neighbors = 10)\n", + " for i in range(0, len(distances.flatten())):\n", + " if i == 0:\n", + " print(\"Searching recommendation for user: \", matrix.index[query_index])\n", + " else:\n", + " rows = data.loc[data['user_id'] == matrix.index[indices.flatten()[i]] ]\n", + " for item in rows.values: \n", + " print(\"\\n User: \", item[0])\n", + " print(\" Play Count: \", item[2]) \n", + " print(\" Song: \", item[3])" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "colab_type": "code", + "id": "erDQ9oe8jV0Q", + "outputId": "57402316-7684-44ce-bd45-67b06f2dac77" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "11973" + ] + }, + "execution_count": 27, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "query_index = np.random.choice(song_pivot.shape[0])\n", + "query_index" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "1AFN-GQ3jm-l" + }, + "outputs": [], + "source": [ + "# Some query index with unique recommendations\n", + "# query_index = 1134\n", + "# query_index 1277" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 646 + }, + "colab_type": "code", + "id": "TBcxov8mYLTs", + "outputId": "75de87a5-dd12-4d8e-b083-6e70d60cd284" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Searching recommendation for user: bcd2779b095b6da759ce245e262d5be5ece3a020\n", + "\n", + " User: 8124ed9c91410c7cdd0eaeaa6c03e20858c16cbf\n", + " Play Count: 1\n", + " Song: Dimension\n", + "\n", + " User: 44efca4a32ec10570415ff27d750bcb7317a7537\n", + " Play Count: 1\n", + " Song: Dimension\n", + "\n", + " User: cfa7f2cce2d8ec824d67708e0fc7506ab02d8fd2\n", + " Play Count: 2\n", + " Song: Dimension\n", + "\n", + " User: b239d5d51be091b059a19c8715efc005f896c78c\n", + " Play Count: 1\n", + " Song: Dimension\n", + "\n", + " User: 0d50e72b0e312a574a99b94da96f7796740d7e6d\n", + " Play Count: 1\n", + " Song: Dimension\n", + "\n", + " User: 9e66bf7016204731edd27cdcf37a9168091a0326\n", + " Play Count: 1\n", + " Song: Dimension\n", + "\n", + " User: 18553a9964e4b7019f6ec873e7d4915bc4444c2f\n", + " Play Count: 1\n", + " Song: Dimension\n", + "\n", + " User: 440924f2c522a9c2539abaf58f24fff1d76723f1\n", + " Play Count: 1\n", + " Song: Dimension\n", + "\n", + " User: 93a0369cedca0b2ce753ba61d011d683b5ad85a1\n", + " Play Count: 1\n", + " Song: Dimension\n" + ] + } + ], + "source": [ + "findRecomendationsUsers(model_user, song_pivot, knnData, query_index)" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "6mXbv7so2dnC" + }, + "outputs": [], + "source": [ + "song_plays = (users.\n", + " groupby(by = ['song_ids'])['play_count'].\n", + " sum().\n", + " reset_index().\n", + " rename(columns = {'play_count': 'total_song_plays'})\n", + " [['song_ids', 'total_song_plays']]\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 297 + }, + "colab_type": "code", + "id": "F0g_TE5Aggky", + "outputId": "6535b093-81fd-4aab-b6c6-e9c1dc0fdd92" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
total_song_plays
count163206.000000
mean28.334375
std215.826789
min1.000000
25%1.000000
50%5.000000
75%15.000000
max35432.000000
\n", + "
" + ], + "text/plain": [ + " total_song_plays\n", + "count 163206.000000\n", + "mean 28.334375\n", + "std 215.826789\n", + "min 1.000000\n", + "25% 1.000000\n", + "50% 5.000000\n", + "75% 15.000000\n", + "max 35432.000000" + ] + }, + "execution_count": 31, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "song_plays.describe()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "mnWEZWWuF1nw" + }, + "source": [ + "# Item Based Colaborative Filtering" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "IdfsKpIyKfhr" + }, + "outputs": [], + "source": [ + "from scipy.sparse import csr_matrix" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "TlmQrSTcuaIH" + }, + "outputs": [], + "source": [ + "sparse_matrix = song.pivot(index='song_ids',columns='user_id',values='play_count')\n", + "sparse_matrix = sparse_matrix.fillna(0)" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 470 + }, + "colab_type": "code", + "id": "c0YbcQXDuj1M", + "outputId": "41ac469e-afd1-4e3f-af90-bb8a6baa1e33" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
user_id00020fcd8b01986a6a85b896ccde6c49f35142ad000724134199acaa98869fc4ffb805198d2940eb0011d5f4fb02ff276763d385c3f2ded2b00ad94a001a4329228373ec5d4efe1084317b4009df7b9700200865ee578746cc29b28d2c14a81c74895a5f00209c99d83b405d47fe87f6761dbf7d259ca8560027bd60fea07d48fa336a979f9fa439bebb44fb0029b299091e9e9040761838785a0689a5f67215002ace7725512ef9180af3c8a0fbf0e1071b72d9003032fc00365d6f15f047c63717a14e0d8aced70032dddb264b47d623c93833a18007a7881024320034614d935784ee588b28dff22a4882a12cb40100365d3bf40b02ebd932bd43e7b463495a46ad6800387504e8fc8aa34827a637dea25000e86e85a30038d0eaac8e3e132e7199611a8add77815f3d860049335750252b238b7ed2d2018033c1ebd1e7ab00520d79b219630ec27d8d8b2a0399768528444000539b30daa6999e65cc44867acac6c336004a0200545af48096210f97930b66f6661df88729900f005aa4c4bc1dc74114b8bd6ffdca64c1d218474f005f71ae59d898709e7b88002c3be4d2d599a66f00629154d40c2100fb492508b4c535c661718da4006665569461ff1711a0f3f29c47b5e7ab43edb2006771ed630b23afa026256aa70ea4bbde3190970068bf86cce92b76b987c62578735c51b2bec607006a47b6c163573d750abcc50683f52448b59d760072963112236d305279a9fed2b195abd365a806007308634313ec6dcb20b55581d6e4ad1dcca8b700766ba637c5dbdb52ff0a5cbf13229e2135d0c2007835ec61401b07b4a61c3164556a7c5056ba2f007bf363856974d0bd57d3e4cdc93423769361f3007e450faa8daa47362a2a3f5d0a6f4ecd535f3f007f4e112f22e32bd1f3ef634afb30bf7262211a0086a41ed007814cb836ce8a541a92c68ab3c6880088bbf8870349910bc13612ac74384397d01f160088ee55a3c5834bce7e010af03680820bad5f1d0091d5d21c0f709d513d79bc17952e5ac0cc56a100949b7e0d675efa40992a0e3f66db26b7a27b08009d9c2babc0c05aa8a4419ad00f5105aa99c5e100a36168ed80334a6816e1feefd5b40aba212e31...ff5f55c48e94d0da039a0d40e03e2f254f5195bbff63ab995d2d5b87ced0f93dc3b4d13db02c2491ff65ec4a9765bcc63578aaea2eb68e502e462e2cff66c1e5c1fb424e06c761c95048c9ec4faa8070ff6bd57fa3d8860553ec778e24d73e775b280fc9ff6d36e7292335ea32e89b19d269a2d760a91a49ff6e96b1129b9f6330d0f1e59be39751e175ee4fff77fea5a8d84f5109de17185e2a7fb5d7e2a467ff7a04e8400800d26e522e436a088b1251a4cdf6ff80830a101547b5c112e72e939dde33f0a68a1bff814d959cc4b515fa7dccffb1355104791c60edff81bdc5042aabf6687b0322acc5803c2cb4d912ff85e05b8d2d01540cf41260df2532c4f16510d0ff8891b901eed1a3abc9bd4c53a17d2bcdc0ead7ff8a343fa2e3b0f61f3728dec69eae6ad137528dff8c7b25076f76e2ba5bfe62b094b95b50daa0edff8e0fe264adf90b61d2146b51f336abea8c6030ff93375e8105444419de44b55658d0dbe1c883d7ffa9ab7e3ff7b5d4fbac66bc9997949a9e721a91ffaa6d6870522d52107eb2cbbcfe7d1634400111ffbc11b17e88f2af9e7235630078d78d003f526affbfe37dc0f8454d4c7ad2061fb69287d1dc47f2ffc31c581692545c74b2508f46b83fac136f1a88ffc683d098d818421f22363b150a19fd7d307764ffd4cb97d77ee06adf29b0632350589404552b8effda55050d450037e24b67b8e0f48f4f16a03872ffdfb7f168ab6dc11c03a3af8684ff736aa06f04ffe0d010c60ef28ef5e6923e758f514e755adfcfffe33c42d3c85ad750326fa0ae45cc3b84d58f15ffe5a0afac73eefdc4e6cfb0a40df22480ed4ce2ffe5b8df7ba3210f4724fe8d9eeca0c435bcfab9ffe6cff4a35b9fa9bc77ce9f5c62803521293f0fffe70ee0afa3930edf9bca702cb3982d3ff747beffe98240b89fb05e1997ed4933b544d434f108b1ffec87ea10f29a7103edd660c45c65527b1c4b9dffee916020d891a74264b8326829742333b79103ffef5c05e4f25af2e8e9880af84d66936056b597fff24c114beca48744a1ca2b699dae8f42398ad1fff7e94f0a8d3c6c705b5f7c677d61da82aa545bfffcfe9b89b791e39ff3e643aa57ae9303079c56
song_ids
SOAAAQN12AB01856D30.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
SOAAEHR12A6D4FB0600.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
SOAASSD12AB0181AA60.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
SOABLAF12AB018E1D90.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
SOABTKM12A8AE4721E0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.01.00.00.00.00.00.00.00.00.00.0
......................................................................................................................................................................................................................................................
SOZXHBQ12AB01866260.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
SOZYUKG12A6D4FB64F0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
SOZZPYH12AB01875780.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
SOZZQBH12A6D4FAFD80.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
SOZZVMW12AB0183B520.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
\n", + "

1311 rows × 16083 columns

\n", + "
" + ], + "text/plain": [ + "user_id 00020fcd8b01986a6a85b896ccde6c49f35142ad ... fffcfe9b89b791e39ff3e643aa57ae9303079c56\n", + "song_ids ... \n", + "SOAAAQN12AB01856D3 0.0 ... 0.0\n", + "SOAAEHR12A6D4FB060 0.0 ... 0.0\n", + "SOAASSD12AB0181AA6 0.0 ... 0.0\n", + "SOABLAF12AB018E1D9 0.0 ... 0.0\n", + "SOABTKM12A8AE4721E 0.0 ... 0.0\n", + "... ... ... ...\n", + "SOZXHBQ12AB0186626 0.0 ... 0.0\n", + "SOZYUKG12A6D4FB64F 0.0 ... 0.0\n", + "SOZZPYH12AB0187578 0.0 ... 0.0\n", + "SOZZQBH12A6D4FAFD8 0.0 ... 0.0\n", + "SOZZVMW12AB0183B52 0.0 ... 0.0\n", + "\n", + "[1311 rows x 16083 columns]" + ] + }, + "execution_count": 34, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "sparse_matrix" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "OvXrFbVMKjDC" + }, + "outputs": [], + "source": [ + "sparse_matrix_sparse = csr_matrix(sparse_matrix.values)" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "oXr1adkyiULh" + }, + "outputs": [], + "source": [ + "from sklearn.neighbors import NearestNeighbors\n", + "knn=NearestNeighbors(n_neighbors=10,metric='cosine')\n", + "knn_model=knn.fit(sparse_matrix_sparse)" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "GUPnY-6j3OFW" + }, + "outputs": [], + "source": [ + "# def findRecomendations(model, matrix, query_index):\n", + "# distances, indices = model.kneighbors([matrix.iloc[query_index, :]], n_neighbors = 10)\n", + "# for i in range(0, len(distances.flatten())):\n", + "# if i == 0:\n", + "# print(sparse_matrix.index[query_index], nd.loc[nd['song_ids'] == sparse_matrix.index[query_index]].song_titles.values[0])\n", + "# else:\n", + "# print(i, sparse_matrix.index[indices.flatten()[i]], nd.loc[nd['song_ids'] == sparse_matrix.index[indices.flatten()[i]] ].song_titles.values[0], distances.flatten()[i])" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "WqGAs_mlJVlL" + }, + "outputs": [], + "source": [ + "def findRecomendations(model, matrix, query_index):\n", + " distances, indices = model.kneighbors([matrix.iloc[query_index, :]], n_neighbors = 10)\n", + " for i in range(0, len(distances.flatten())):\n", + " if i == 0:\n", + " rowDetails = nd.loc[nd['song_ids'] == matrix.index[query_index]]\n", + " print(\"Song: \", rowDetails.song_titles.values[0], \", Artist: \", rowDetails.artist_names.values[0] )\n", + " else:\n", + " rowDetails = nd.loc[nd['song_ids'] == matrix.index[indices.flatten()[i]] ]\n", + " print(\" Recommendation\", i, \": \")\n", + " print(\" Song: \", rowDetails.song_titles.values[0]) \n", + " print(\" Artist: \", rowDetails.artist_names.values[0])\n", + " print(\" Distance: \", distances.flatten()[i])" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "iMphLQ5ju1FA" + }, + "outputs": [], + "source": [ + "query_index = np.random.choice(sparse_matrix.shape[0])\n", + "query_index\n", + "query_index = 111" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 646 + }, + "colab_type": "code", + "id": "cUc-P3dB3fo4", + "outputId": "86167a1d-9e93-4217-d09c-8f9597612b07" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Song: Meet Me In The Bathroom , Artist: The Strokes\n", + " Recommendation 1 : \n", + " Song: Between Love & Hate\n", + " Artist: The Strokes\n", + " Distance: 0.7475532789460535\n", + " Recommendation 2 : \n", + " Song: Ahead By A Century\n", + " Artist: The Tragically Hip\n", + " Distance: 0.9814504441695933\n", + " Recommendation 3 : \n", + " Song: Human Being\n", + " Artist: The New York Dolls\n", + " Distance: 0.9836043541054011\n", + " Recommendation 4 : \n", + " Song: Dungeon Master\n", + " Artist: EPMD / Nocturnal\n", + " Distance: 0.9848730148632904\n", + " Recommendation 5 : \n", + " Song: Brother\n", + " Artist: Alice In Chains\n", + " Distance: 0.9891693927785223\n", + " Recommendation 6 : \n", + " Song: Welcome\n", + " Artist: Phil Collins\n", + " Distance: 0.9974236728013324\n", + " Recommendation 7 : \n", + " Song: 15 Step\n", + " Artist: Radiohead\n", + " Distance: 0.9981707181046349\n", + " Recommendation 8 : \n", + " Song: Pero Me Acuerdo De Tí\n", + " Artist: Christina Aguilera\n", + " Distance: 0.9989296116164493\n", + " Recommendation 9 : \n", + " Song: Don't Worry About It (Edited)\n", + " Artist: N.E.R.D.\n", + " Distance: 1.0\n" + ] + } + ], + "source": [ + "findRecomendations(knn_model, sparse_matrix, query_index)" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "IgLxfIYCxYmt" + }, + "outputs": [], + "source": [ + "distances, indices = knn_model.kneighbors([sparse_matrix.iloc[query_index, :]], n_neighbors = 6)" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 51 + }, + "colab_type": "code", + "id": "AFZE7jzIxb3D", + "outputId": "cb7d433e-0836-4a9a-b6f2-77879005b9aa" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(array([[0. , 0.74755328, 0.98145044, 0.98360435, 0.98487301,\n", + " 0.98916939]]), array([[ 111, 1235, 689, 349, 425, 760]]))" + ] + }, + "execution_count": 42, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "distances, indices " + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 374 + }, + "colab_type": "code", + "id": "YtflsAJMxpPX", + "outputId": "b6eca4a0-f867-469c-d7be-41905e25e324" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Song: Meet Me In The Bathroom , Artist: The Strokes\n", + " Recommendation 1 : \n", + " Song: Between Love & Hate\n", + " Artist: The Strokes\n", + " Distance: 0.7475532789460535\n", + " Recommendation 2 : \n", + " Song: Ahead By A Century\n", + " Artist: The Tragically Hip\n", + " Distance: 0.9814504441695933\n", + " Recommendation 3 : \n", + " Song: Human Being\n", + " Artist: The New York Dolls\n", + " Distance: 0.9836043541054011\n", + " Recommendation 4 : \n", + " Song: Dungeon Master\n", + " Artist: EPMD / Nocturnal\n", + " Distance: 0.9848730148632904\n", + " Recommendation 5 : \n", + " Song: Brother\n", + " Artist: Alice In Chains\n", + " Distance: 0.9891693927785223\n" + ] + } + ], + "source": [ + "for i in range(0, len(distances.flatten())):\n", + " if i == 0:\n", + " rowDetails = nd.loc[nd['song_ids'] == sparse_matrix.index[query_index]]\n", + " print(\"Song: \", rowDetails.song_titles.values[0], \", Artist: \", rowDetails.artist_names.values[0] )\n", + " else:\n", + " rowDetails = nd.loc[nd['song_ids'] == sparse_matrix.index[indices.flatten()[i]] ]\n", + " print(\" Recommendation\", i, \": \")\n", + " print(\" Song: \", rowDetails.song_titles.values[0]) \n", + " print(\" Artist: \", rowDetails.artist_names.values[0])\n", + " print(\" Distance: \", distances.flatten()[i])" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "hrhJnV5h0lVF" + }, + "outputs": [], + "source": [ + "# nd" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "qC-wxdyTG1Tf" + }, + "outputs": [], + "source": [ + "# nd['artist_names'].nunique()" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "FWGMaIoc0gjl" + }, + "outputs": [], + "source": [ + "# s = nd['song_ids']" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "FgmZVMWW1ou0" + }, + "outputs": [], + "source": [ + "# nd['song_ids'] == 'SOOSYMY12AB01888CD'" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "nyg1BkFJ0_dn" + }, + "outputs": [], + "source": [ + "# print(nd.loc[nd['song_ids'] == 'SOOSYMY12AB01888CD', 'song_titles'].values[0])" + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "collapsed_sections": [], + "name": "KNN", + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/Spark_ALS.html b/Spark_ALS.html new file mode 100644 index 0000000..f004511 --- /dev/null +++ b/Spark_ALS.html @@ -0,0 +1,14616 @@ + + + + +Spark_ALS + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+
+

Install Java, Spark, and Findspark

This installs Apache Spark 2.3.2, Java 8, and Findspark, a library that makes it easy for Python to find Spark.

+ +
+
+
+
+
+
In [0]:
+
+
+
!apt-get install openjdk-8-jdk-headless -qq > /dev/null
+!wget -q http://www-eu.apache.org/dist/spark/spark-2.4.4/spark-2.4.4-bin-hadoop2.7.tgz
+!tar xf spark-2.4.4-bin-hadoop2.7.tgz
+!pip install -q findspark
+
+ +
+
+
+ +
+
+
+
In [103]:
+
+
+
!pip install py4j
+!pip install pyspark
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
Requirement already satisfied: py4j in /usr/local/lib/python3.6/dist-packages (0.10.7)
+Requirement already satisfied: pyspark in /usr/local/lib/python3.6/dist-packages (2.4.4)
+Requirement already satisfied: py4j==0.10.7 in /usr/local/lib/python3.6/dist-packages (from pyspark) (0.10.7)
+
+
+
+ +
+
+ +
+
+
+
+

Set Environment Variables

Set the locations where Spark and Java are installed.

+ +
+
+
+
+
+
In [0]:
+
+
+
import os
+os.environ["JAVA_HOME"] = "/usr/lib/jvm/java-8-openjdk-amd64"
+os.environ["SPARK_HOME"] = "/content/spark-2.4.4-bin-hadoop2.7"
+
+ +
+
+
+ +
+
+
+
+

Start a SparkSession

This will start a local Spark session.

+ +
+
+
+
+
+
In [0]:
+
+
+
import os
+import time
+
+ +
+
+
+ +
+
+
+
In [0]:
+
+
+
# spark imports
+from pyspark.sql import SparkSession
+from pyspark.sql.functions import UserDefinedFunction, explode, desc
+from pyspark.sql.types import StringType, ArrayType
+from pyspark.mllib.recommendation import ALS
+
+ +
+
+
+ +
+
+
+
In [0]:
+
+
+
# data science imports
+import math
+import numpy as np
+import pandas as pd
+
+# visualization imports
+import seaborn as sns
+import matplotlib.pyplot as plt
+
+%matplotlib inline
+
+ +
+
+
+ +
+
+
+
In [0]:
+
+
+
import findspark
+findspark.init("spark-2.4.4-bin-hadoop2.7")# SPARK_HOME
+
+from pyspark.sql import SparkSession
+spark = SparkSession.builder.master("local[*]").getOrCreate()
+
+ +
+
+
+ +
+
+
+
In [109]:
+
+
+
from google.colab import drive
+drive.mount('/content/gdrive')
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
Drive already mounted at /content/gdrive; to attempt to forcibly remount, call drive.mount("/content/gdrive", force_remount=True).
+
+
+
+ +
+
+ +
+
+
+
In [0]:
+
+
+
!cp /content/gdrive/My\ Drive/MscsDs/msdchallenge/kaggle_visible_evaluation_triplets.txt .
+
+ +
+
+
+ +
+
+
+
In [0]:
+
+
+
!cp -r /content/gdrive/My\ Drive/MscsDs/MSongsDB-master/PythonSrc .
+
+ +
+
+
+ +
+
+
+
In [0]:
+
+
+
# ! cd /content/gdrive/My\ Drive/MscsDs/ && tar -zxvf millionsongsubset_full.tar.gz
+
+ +
+
+
+ +
+
+
+
In [112]:
+
+
+
users = pd.read_table('./kaggle_visible_evaluation_triplets.txt', sep='\t', names= ['user_id','song_ids','play_count'])
+users.head()
+
+ +
+
+
+ +
+
+ + +
+ +
Out[112]:
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
user_idsong_idsplay_count
0fd50c4007b68a3737fe052d5a4f78ce8aa117f3dSOBONKR12A58A7A7E01
1fd50c4007b68a3737fe052d5a4f78ce8aa117f3dSOEGIYH12A6D4FC0E31
2fd50c4007b68a3737fe052d5a4f78ce8aa117f3dSOFLJQZ12A6D4FADA61
3fd50c4007b68a3737fe052d5a4f78ce8aa117f3dSOHTKMO12AB01843B01
4fd50c4007b68a3737fe052d5a4f78ce8aa117f3dSODQZCY12A6D4F9D111
+
+
+ +
+ +
+
+ +
+
+
+
In [113]:
+
+
+
from pandas import DataFrame
+
+temp = DataFrame(users, columns= ['user_id', 'song_ids','play_count'])
+export_csv = temp.to_csv (r'./triplets.csv', index = None, header=True)
+print(temp)
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
                                          user_id  ... play_count
+0        fd50c4007b68a3737fe052d5a4f78ce8aa117f3d  ...          1
+1        fd50c4007b68a3737fe052d5a4f78ce8aa117f3d  ...          1
+2        fd50c4007b68a3737fe052d5a4f78ce8aa117f3d  ...          1
+3        fd50c4007b68a3737fe052d5a4f78ce8aa117f3d  ...          1
+4        fd50c4007b68a3737fe052d5a4f78ce8aa117f3d  ...          1
+...                                           ...  ...        ...
+1450928  5e650759ebf89012044c6d52121eeada8b0ec814  ...          1
+1450929  5e650759ebf89012044c6d52121eeada8b0ec814  ...          2
+1450930  5e650759ebf89012044c6d52121eeada8b0ec814  ...          2
+1450931  5e650759ebf89012044c6d52121eeada8b0ec814  ...          2
+1450932  5e650759ebf89012044c6d52121eeada8b0ec814  ...          3
+
+[1450933 rows x 3 columns]
+
+
+
+ +
+
+ +
+
+
+
In [114]:
+
+
+
from sklearn.preprocessing import LabelEncoder
+
+frame = temp
+lb_make = LabelEncoder()
+frame["user_id_code"] = lb_make.fit_transform(frame["user_id"])
+frame[["user_id", "user_id_code"]].head(11)
+
+lb_make2 = LabelEncoder()
+frame["song_id_code"] = lb_make2.fit_transform(frame["song_ids"])
+frame[["song_ids", "song_id_code"]].head(11)
+
+ +
+
+
+ +
+
+ + +
+ +
Out[114]:
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
song_idssong_id_code
0SOBONKR12A58A7A7E010546
1SOEGIYH12A6D4FC0E328684
2SOFLJQZ12A6D4FADA636622
3SOHTKMO12AB01843B051861
4SODQZCY12A6D4F9D1124663
5SOXLOQG12AF72A2D55148312
6SOUVUHC12A67020E3B133075
7SOUQERE12A58A75633131771
8SOIPJAX12A8C141A2D57332
9SOEFCDJ12AB0185FA028367
10SOATCSU12A8C13393A4975
+
+
+ +
+ +
+
+ +
+
+
+
In [116]:
+
+
+
frame
+
+ +
+
+
+ +
+
+ + +
+ +
Out[116]:
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
user_idsong_idsplay_countuser_id_codesong_id_code
0fd50c4007b68a3737fe052d5a4f78ce8aa117f3dSOBONKR12A58A7A7E0110881110546
1fd50c4007b68a3737fe052d5a4f78ce8aa117f3dSOEGIYH12A6D4FC0E3110881128684
2fd50c4007b68a3737fe052d5a4f78ce8aa117f3dSOFLJQZ12A6D4FADA6110881136622
3fd50c4007b68a3737fe052d5a4f78ce8aa117f3dSOHTKMO12AB01843B0110881151861
4fd50c4007b68a3737fe052d5a4f78ce8aa117f3dSODQZCY12A6D4F9D11110881124663
..................
14509285e650759ebf89012044c6d52121eeada8b0ec814SOVLNXV12A6D4F706E140490136574
14509295e650759ebf89012044c6d52121eeada8b0ec814SOVDSJC12A58A7A271240490134757
14509305e650759ebf89012044c6d52121eeada8b0ec814SOBRHVR12A8C133F3524049011310
14509315e650759ebf89012044c6d52121eeada8b0ec814SOMGVYU12A8C1314FF24049080823
14509325e650759ebf89012044c6d52121eeada8b0ec814SOTCMDJ12A6D4F8528340490122750
+

1450933 rows × 5 columns

+
+
+ +
+ +
+
+ +
+
+
+
In [0]:
+
+
+
export_csv = frame.to_csv (r'./triplets.csv', index = None, header=True)
+
+ +
+
+
+ +
+
+
+
In [0]:
+
+
+
# spark imports
+from pyspark.ml.feature import StringIndexer
+from pyspark.ml import Pipeline
+from pyspark.sql.functions import col
+from pyspark.ml.evaluation import RegressionEvaluator
+from pyspark.ml.recommendation import ALS
+from pyspark.sql import SparkSession
+from pyspark.sql.functions import UserDefinedFunction, explode, desc
+from pyspark.sql.types import StringType, ArrayType
+
+ +
+
+
+ +
+
+
+
In [0]:
+
+
+
spark = SparkSession \
+    .builder \
+    .appName("Music Recommender System") \
+    .config("spark.driver.maxResultSize", "96g") \
+    .config("spark.driver.memory", "96g") \
+    .config("spark.executor.memory", "8g") \
+    .config("spark.master", "local[12]") \
+    .getOrCreate()
+# get spark context
+sc = spark.sparkContext
+
+ +
+
+
+ +
+
+
+
In [0]:
+
+
+
df = spark.read.load('./triplets.csv', format='csv', header=True, inferSchema=True)
+df.show(10, truncate=False)
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
+----------------------------------------+------------------+----------+------------+------------+
+|user_id                                 |song_ids          |play_count|user_id_code|song_id_code|
++----------------------------------------+------------------+----------+------------+------------+
+|fd50c4007b68a3737fe052d5a4f78ce8aa117f3d|SOBONKR12A58A7A7E0|1         |108811      |10546       |
+|fd50c4007b68a3737fe052d5a4f78ce8aa117f3d|SOEGIYH12A6D4FC0E3|1         |108811      |28684       |
+|fd50c4007b68a3737fe052d5a4f78ce8aa117f3d|SOFLJQZ12A6D4FADA6|1         |108811      |36622       |
+|fd50c4007b68a3737fe052d5a4f78ce8aa117f3d|SOHTKMO12AB01843B0|1         |108811      |51861       |
+|fd50c4007b68a3737fe052d5a4f78ce8aa117f3d|SODQZCY12A6D4F9D11|1         |108811      |24663       |
+|fd50c4007b68a3737fe052d5a4f78ce8aa117f3d|SOXLOQG12AF72A2D55|1         |108811      |148312      |
+|d7083f5e1d50c264277d624340edaaf3dc16095b|SOUVUHC12A67020E3B|1         |92390       |133075      |
+|d7083f5e1d50c264277d624340edaaf3dc16095b|SOUQERE12A58A75633|1         |92390       |131771      |
+|d7083f5e1d50c264277d624340edaaf3dc16095b|SOIPJAX12A8C141A2D|1         |92390       |57332       |
+|d7083f5e1d50c264277d624340edaaf3dc16095b|SOEFCDJ12AB0185FA0|2         |92390       |28367       |
++----------------------------------------+------------------+----------+------------+------------+
+only showing top 10 rows
+
+
+
+
+ +
+
+ +
+
+
+
In [0]:
+
+
+
# indexer = [StringIndexer(inputCol=column, outputCol=column+"_index") for column in list(set(df.columns)-set(['overall'])) ]
+# pipeline = Pipeline(stages=indexer)
+# transformed = pipeline.fit(df).transform(df)
+# transformed.show(truncate=False)
+
+ +
+
+
+ +
+
+
+
In [0]:
+
+
+
# user = list(transformed.select('user_id_index').distinct().sort(transformed["user_id_index"])) # Get our unique customers
+# song = list(transformed.select('song_ids_index').distinct().sort(transformed["song_ids_index"])) # Get our unique products that were purchased
+# playCount = list(transformed.select('play_count')) # All of our purchases
+
+# # rows = transformed.select('user_id_index').astype('category', categories = user).cat.codes 
+# # # Get the associated row indices
+# # cols = transformed.song_ids_index.astype('category', categories = song).cat.codes 
+# # Get the associated column indices
+# # playCount_sparse = sparse.csr_matrix((playCount, (user, song)), shape=(len(user), len(song)))
+
+ +
+
+
+ +
+
+
+
In [0]:
+
+
+
(training,test)=df.randomSplit([0.8, 0.2])
+
+ +
+
+
+ +
+
+
+
In [0]:
+
+
+
als=ALS(maxIter=5, regParam=0.09,rank=25,userCol="user_id_code",itemCol="song_id_code",ratingCol="play_count",coldStartStrategy="drop",nonnegative=True)
+model=als.fit(training)
+
+ +
+
+
+ +
+
+
+
In [0]:
+
+
+
evaluator=RegressionEvaluator(metricName="rmse",labelCol="play_count",predictionCol="prediction")
+predictions=model.transform(test)
+predictions.show(50, truncate = False)
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
+----------------------------------------+------------------+----------+------------+------------+----------+
+|user_id                                 |song_ids          |play_count|user_id_code|song_id_code|prediction|
++----------------------------------------+------------------+----------+------------+------------+----------+
+|8982c3890ef7a2978292a3c986e61cb914723261|SOAAOQV12A58A7FDFA|1         |59044       |148         |1.0275742 |
+|19faa693156a63d3956f9bea38bd1ef594249144|SOABVCK12A6D4F8A92|2         |11215       |471         |0.5101284 |
+|ba6186342cce189527238d6961d782a78982ae8f|SOABVCK12A6D4F8A92|2         |80079       |471         |0.30069754|
+|cae426aea0ddb4132d197c6ca6ff8281d75a4954|SOADGAX12A8151B896|2         |87115       |833         |1.0532596 |
+|cab90d247ebe4fa99117b686e40acbfd58ca2ca0|SOAKBZR12AC468D1DD|1         |87050       |2659        |1.1064874 |
+|8439c1a5fbd468d956fceb15a7495c08bc51c54c|SOAOGOV12A8C13ACED|7         |56813       |3749        |0.71650064|
+|55b972d3bd087312c570bf501c411412c6b49665|SOAOGOV12A8C13ACED|1         |36784       |3749        |0.38686666|
+|9a336136b35549aeca2ecc0d68e5cf5cbc32455f|SOAOGOV12A8C13ACED|1         |66134       |3749        |1.3442959 |
+|dc7a1da974ed898e356d3277970ac9d4c8bc478d|SOAOGOV12A8C13ACED|1         |94737       |3749        |1.3043659 |
+|56e27943491cedc2eb4a505a080def6a5068fdf0|SOAOGOV12A8C13ACED|1         |37259       |3749        |0.29489112|
+|ab428a3ce64b66fc4ab37801b126c90de5b46b4b|SOAOGOV12A8C13ACED|3         |73494       |3749        |3.8756835 |
+|9d9e0e02d02ccdbe747d760d4840d4ae02519902|SOAOGOV12A8C13ACED|1         |67657       |3749        |2.662067  |
+|b1da390ea4cfeb03d9e80abcc28c0b0631c6b975|SOAOGOV12A8C13ACED|2         |76345       |3749        |2.692673  |
+|6615f72ac5a32426a6a528cd22685a08115a9d18|SOAOGOV12A8C13ACED|1         |43813       |3749        |1.3359375 |
+|f6b6d11dc93a20d976c195f670781952ad505d27|SOARGYR12A6D4F90C7|1         |105899      |4519        |0.6676656 |
+|07c48483fe7d14ce1ca64f38f413dc6dd4a76022|SOARGYR12A6D4F90C7|3         |3374        |4519        |0.87244946|
+|950fbfeccbc60ade6ed5964b8d324d3fed9be7c8|SOARGYR12A6D4F90C7|5         |63946       |4519        |1.4610394 |
+|7fba40fcf9a21f7bb0143f947d935b5947a51759|SOARGYR12A6D4F90C7|1         |54810       |4519        |1.7686548 |
+|8d06f67ebf98f3685726346b182812e01baccbf0|SOARGYR12A6D4F90C7|5         |60544       |4519        |2.030398  |
+|1ed19063a4f3f3ecaa4874ea4eafb63c49783e81|SOAVBMC12A6D4F745A|1         |13258       |5518        |1.7134204 |
+|0d7b286cd669f1078da7da82b650686e398791fd|SOAYQAJ12A67AE123E|1         |5830        |6466        |0.33060303|
+|b39dfda8466831031ccf4f48ed8857a858f2f17c|SOBBSNN12AF72A9C42|1         |77139       |7253        |1.0974667 |
+|388f7b7150bd020ce59b82603f7dd29f590ff8ed|SOBCAQT12A6702123E|1         |24383       |7340        |1.00141   |
+|82436cfc62dd21607c1d60a00ad7db7e4135f32f|SOBDROL12A6D4F9EED|1         |55924       |7754        |2.3457708 |
+|b0e27370b66a67cf83d5562d293dabd4311add5f|SOBFARY12A6310E34F|1         |75943       |8086        |0.89488906|
+|64aa07e24cab5618c80bdc076916190024d83f39|SOBHFYO12A6D4FAC8D|1         |43231       |8638        |1.4804353 |
+|dbfee1e9a3d1cc23a2453d56d0ff3e9162ea5b38|SOBMFOX12A6D4F5B86|1         |94550       |9900        |0.8885433 |
+|360d6dff96604c2cce95c3383d9b70c2a066ba8d|SOBNHMD12A67ADADA3|1         |23311       |10206       |1.1336254 |
+|254f817243dbd2539256bf456aa9036f5379b654|SOBNHMD12A67ADADA3|1         |16064       |10206       |2.2536728 |
+|3069c3d629d106d80a222cedb4a20361761ef132|SOBNHMD12A67ADADA3|1         |20929       |10206       |0.88243246|
+|9b52e895436a0aa8f1290cf863a0994ac58de52e|SOBNHMD12A67ADADA3|1         |66644       |10206       |1.2767642 |
+|e57715de18deb3245af1b1e751b06929f0d58d70|SOBNHMD12A67ADADA3|1         |98575       |10206       |1.2492512 |
+|39ee1eff10a5c48be44f103f592374d53c692dfa|SOBNHMD12A67ADADA3|1         |25031       |10206       |1.0494484 |
+|a0044a2450e744509e42a696e90c5b75f5f36af3|SOBNHMD12A67ADADA3|1         |68699       |10206       |0.7490436 |
+|6e93172f31b8240b848a980036b721e5d4e56a02|SOBOUPA12A6D4F81F1|9         |47501       |10623       |0.38634884|
+|61338bbdf424e8f8f986ef8f1315aa4df5476a1d|SOBOUPA12A6D4F81F1|1         |41704       |10623       |0.18352605|
+|99a61c348645b8153dcc9982ec3853d5a08da0e1|SOBOUPA12A6D4F81F1|1         |65905       |10623       |4.766694  |
+|10d63816e42097e44b2b05e2f62ef3b3acebe0ee|SOBOUPA12A6D4F81F1|1         |7281        |10623       |2.4408543 |
+|346e890cd7f82b0386ec8d971004b9252c083455|SOBOUPA12A6D4F81F1|1         |22609       |10623       |4.8452806 |
+|053b73c5c8b38f195ecab4a6858c832f18e52876|SOBOUPA12A6D4F81F1|3         |2259        |10623       |3.497225  |
+|327712b9a51091c064b3ded8c63569722e808f0b|SOBOUPA12A6D4F81F1|1         |21769       |10623       |0.91443443|
+|2fe09ed614ae7b3e5e1e991b0c42636a93fa5aca|SOBOUPA12A6D4F81F1|38        |20671       |10623       |2.1283727 |
+|4ae4df63d5d70b291dd507da656acf7676105bd4|SOBOUPA12A6D4F81F1|3         |32199       |10623       |1.3279399 |
+|92e22578b1dd365da69bf87cd197bfdfb3841a9e|SOBOUPA12A6D4F81F1|1         |63033       |10623       |0.66111124|
+|cf7f599565576f0d0d64fba61227d32966601365|SOBOUPA12A6D4F81F1|2         |89109       |10623       |1.5132858 |
+|f7b899ab523efde466a1774c4961852938d5f1af|SOBOUPA12A6D4F81F1|3         |106347      |10623       |3.5346136 |
+|1fe40010162258712013a9a466324f491a3ad288|SOBOUPA12A6D4F81F1|5         |13701       |10623       |2.0195777 |
+|d0f781e47e4777b4bac0c77dd6c170eb833bf068|SOBOUPA12A6D4F81F1|2         |89772       |10623       |1.8618262 |
+|81c301ce91b185cea96b633e3105887ae4a72fe1|SOBOUPA12A6D4F81F1|9         |55704       |10623       |3.842008  |
+|9d8e4741ca9d8e78acd7b3081d022a4bbacd955c|SOBOUPA12A6D4F81F1|1         |67628       |10623       |1.1754149 |
++----------------------------------------+------------------+----------+------------+------------+----------+
+only showing top 50 rows
+
+
+
+
+ +
+
+ +
+
+
+
In [0]:
+
+
+
# rmse = evaluator.evaluate(predictions)
+
+ +
+
+
+ +
+
+
+
In [0]:
+
+
+
# print("Root-mean-square error = " + str(rmse))
+
+ +
+
+
+ +
+
+
+
In [0]:
+
+
+
# user_recs=model.recommendForAllUsers(10).show(10, truncate = False)
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
+-------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+|user_id_index|recommendations                                                                                                                                                                                              |
++-------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+|148          |[[132559, 128.63263], [147680, 83.976524], [66419, 82.88117], [125845, 76.72285], [82226, 76.19292], [39411, 76.14007], [162509, 75.64509], [99909, 63.91176], [98323, 63.563046], [117480, 62.751663]]      |
+|463          |[[50694, 81.836334], [39411, 64.48308], [147680, 64.23534], [122151, 61.286102], [91642, 56.230762], [18266, 45.621635], [132559, 45.549026], [162509, 43.640633], [125845, 39.744972], [28504, 38.03746]]   |
+|471          |[[91642, 166.9629], [90521, 82.83951], [118079, 81.80899], [90425, 70.81573], [28504, 69.14364], [125845, 65.72644], [130593, 63.165348], [147680, 60.90121], [123867, 60.728004], [116217, 54.02317]]       |
+|496          |[[98323, 561.9435], [159673, 237.96635], [29924, 204.07669], [130289, 202.01738], [162509, 188.40092], [64530, 180.07327], [96723, 176.96783], [47412, 176.5399], [117683, 176.40698], [94070, 173.90211]]   |
+|833          |[[125845, 261.29282], [162509, 211.07877], [91642, 209.26482], [90521, 200.1382], [39411, 183.05717], [132559, 174.52623], [50694, 170.21997], [147680, 165.52065], [82226, 135.1852], [93177, 130.17105]]   |
+|1088         |[[91642, 477.74738], [132559, 301.17938], [98323, 163.98624], [123867, 163.49843], [130593, 150.79263], [147680, 148.13669], [28504, 145.4549], [90521, 139.62958], [162509, 136.77386], [122151, 136.32388]]|
+|1238         |[[18266, 157.90025], [91642, 144.36684], [50694, 119.0692], [122151, 78.154465], [11315, 73.731895], [62883, 68.069824], [36371, 66.961914], [154520, 66.59154], [9336, 64.87565], [63740, 64.10445]]        |
+|1342         |[[132559, 215.22742], [32380, 146.98671], [123867, 143.82867], [40945, 137.36111], [117480, 121.496414], [36371, 117.13508], [91642, 107.41648], [21660, 107.31862], [98323, 104.51557], [46713, 104.25622]] |
+|1580         |[[132559, 347.78375], [98323, 195.82375], [159673, 132.96431], [51399, 103.85994], [64530, 102.61894], [162509, 90.60711], [90425, 89.49118], [23038, 87.83676], [36371, 78.12712], [36489, 73.4358]]        |
+|1591         |[[50694, 125.0975], [122151, 99.453705], [88869, 85.341286], [132559, 70.60342], [91642, 66.271194], [80202, 65.54762], [147680, 63.61119], [162509, 47.968006], [66419, 47.93394], [47290, 46.066273]]      |
++-------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+only showing top 10 rows
+
+
+
+
+ +
+
+ +
+
+
+
In [0]:
+
+
+
recs=model.recommendForAllUsers(10).toPandas()
+
+ +
+
+
+ +
+
+
+
In [0]:
+
+
+
recs
+
+ +
+
+
+ +
+
+ + +
+ +
Out[0]:
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
user_id_coderecommendations
0148[(86930, 164.18919372558594), (130976, 143.074...
1463[(140084, 59.36147689819336), (20335, 54.54523...
2471[(140084, 346.9989013671875), (20335, 337.6782...
3496[(86930, 102.5612564086914), (20335, 101.52572...
4833[(39155, 280.4085388183594), (130976, 217.9136...
.........
109984108934[(86930, 162.45037841796875), (3934, 160.69415...
109985108946[(140084, 271.0825500488281), (20335, 264.0805...
109986108961[(140084, 114.94924926757812), (20335, 99.6657...
109987109144[(20335, 165.97198486328125), (86930, 129.8025...
109988109297[(20335, 122.2970199584961), (86930, 58.789989...
+

109989 rows × 2 columns

+
+
+ +
+ +
+
+ +
+
+
+
In [0]:
+
+
+
recs.shape
+
+ +
+
+
+ +
+
+ + +
+ +
Out[0]:
+ + + + +
+
(109989, 2)
+
+ +
+ +
+
+ +
+
+
+
In [0]:
+
+
+
song_df = pd.read_csv('/content/gdrive/My Drive/MscsDs/MillionSongSubset/msd.csv')
+
+ +
+
+
+ +
+
+
+
In [0]:
+
+
+
song_df.head()
+
+ +
+
+
+ +
+
+ + +
+ +
Out[0]:
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Unnamed: 0Unnamed: 0.1song_idssong_titlessong_durationssong_realease_yearsartist_namessong_hotnesssong_temposong_energiessong_danceabilitysong_barssong_beatssong_time_signaturessong_tatumsong_modessong_keysartist_familiartyartist_hotness
000SONHTWP12A8C142744Vals '89162.585670Manolis Famellos & I PodilatesNaN94.3010.00.0[ 1.45502 3.39383 5.32826 7.25953 9.1...[ 0.16441 0.80395 1.45502 2.09102 2.7...3[ 0.16441 0.48418 0.80395 1.13522 1.4...100.2287300.000000
111SOPIHMB12AC468E0DDGhost of the Ocean (Live)214.255870Uriah Heep0.2502149.9210.00.0[ 1.20218 2.80457 4.39266 5.98514 7.5...[ 0.38752 0.79653 1.20218 1.60244 2.0...4[ 0.2523 0.38752 0.52273 ... 212.97102 2...170.6732390.479205
222SODRPJT12AC468DEF1The frog song169.873830Alain-FrançoisNaN136.0440.00.0[ 1.37397 4.48312 7.56804 10.65675 13.7...[ 0.48609 0.93058 1.37397 1.81958 2.2...7[ 0.26328 0.48609 0.70778 0.93058 1.1...120.3803170.300918
333SOLLOTO12AB01804C6Deep Blue Sea (Daniel Rossen home recording)351.503222008Grizzly BearNaN85.0030.00.0[ 0.72449 3.55798 6.37712 9.20176 12.0...[ 0.72449 1.43405 2.1445 2.85228 3.5...4[1.8653000e-01 3.6881000e-01 5.4665000e-01 ......190.7606360.547244
444SOCNYGS12AB01832B8La vérité252.446892007Annie Blanchard0.0000113.2870.00.0[2.2334000e-01 2.3324800e+00 4.4484000e+00 6.5...[2.2334000e-01 7.5000000e-01 1.2775800e+00 1.8...4[2.2334000e-01 3.9890000e-01 5.7445000e-01 ......150.4797350.352460
+
+
+ +
+ +
+
+ +
+
+
+
In [119]:
+
+
+
count = 0
+song_id_found = set()
+for recValue in recs.values:
+    for item in recValue[1]:
+      row = frame.loc[frame['song_id_code'] == item.song_id_code]
+      song_id = row.song_ids.values[0]
+      if ( song_id not in song_id_found) and (song_df.loc[ song_df['song_ids'] == song_id].shape[0] == 1):
+        rowDetails = song_df.loc[ song_df['song_ids'] == song_id]
+        print(" Recommendation to user ", recValue[0], " : ")
+        print("   Song: ", rowDetails.song_titles.values[0])  
+        print("   Artist: ",  rowDetails.artist_names.values[0])
+        song_id_found.add(song_id)
+        count += 1
+        
+    if count > 1:
+      break
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
 Recommendation to user  148  : 
+   Song:  Seed Will Grow
+   Artist:  Ms. Dynamite / Kymani Marley
+ Recommendation to user  1088  : 
+   Song:  Till There Was You (John Creamer & Stephane K Remix)
+   Artist:  Rachael Starr
+
+
+
+ +
+
+ +
+
+
+
In [118]:
+
+
+
print(" Recommendation to user 148 : ")
+for recom in recs.query('user_id_code == 148').recommendations:
+  for item in recom:
+    row = frame.loc[frame['song_id_code'] == item.song_id_code]
+    print("\n   Song ID: ", row.song_ids.values[0])
+    song_id = row.song_ids.values[0]
+    if song_df.loc[ song_df['song_ids'] == song_id].shape[0] == 1:
+      rowDetails = song_df.loc[ song_df['song_ids'] == song_id]
+      print("     Song: ", rowDetails.song_titles.values[0])  
+      print("     Artist: ",  rowDetails.artist_names.values[0])
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
 Recommendation to user 148 : 
+
+   Song ID:  SONGFCZ12AB01859AD
+
+   Song ID:  SOUMPJA12AAF3B3FD0
+
+   Song ID:  SOUEXOI12AB0189BA4
+
+   Song ID:  SODALYQ12AB017EED4
+
+   Song ID:  SOWAWSK12A8C1383B2
+
+   Song ID:  SOAOXTG12A67021AA7
+     Song:  Seed Will Grow
+     Artist:  Ms. Dynamite / Kymani Marley
+
+   Song ID:  SODJYMH12A8AE46EA5
+
+   Song ID:  SOTFIZA12A8C13D80F
+
+   Song ID:  SORJSQI12A6701D62D
+
+   Song ID:  SOXTUWG12AB018A2E2
+
+
+
+ +
+
+ +
+
+
+
In [117]:
+
+
+
print(" Recommendation to user 108811 : ")
+for recom in recs.query('user_id_code == 108811').recommendations:
+  for item in recom:
+    row = frame.loc[frame['song_id_code'] == item.song_id_code]
+    print("\n   Song ID: ", row.song_ids.values[0])
+    song_id = row.song_ids.values[0]
+    if song_df.loc[ song_df['song_ids'] == song_id].shape[0] == 1:
+      rowDetails = song_df.loc[ song_df['song_ids'] == song_id]
+      print("     Song: ", rowDetails.song_titles.values[0])  
+      print("     Artist: ",  rowDetails.artist_names.values[0])
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
 Recommendation to user 108811 : 
+
+   Song ID:  SONGFCZ12AB01859AD
+
+   Song ID:  SODALYQ12AB017EED4
+
+   Song ID:  SOUMPJA12AAF3B3FD0
+
+   Song ID:  SOFVLYV12A8C145D8F
+
+   Song ID:  SOTFIZA12A8C13D80F
+
+   Song ID:  SOUEXOI12AB0189BA4
+
+   Song ID:  SORJSQI12A6701D62D
+
+   Song ID:  SOWAWSK12A8C1383B2
+
+   Song ID:  SOJLDIQ12A58A7E506
+
+   Song ID:  SOLLPYO12A8C13B38C
+
+
+
+ +
+
+ +
+
+
+ + + + + + diff --git a/Spark_ALS.ipynb b/Spark_ALS.ipynb new file mode 100644 index 0000000..763b39f --- /dev/null +++ b/Spark_ALS.ipynb @@ -0,0 +1,1518 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "kvD4HBMi0ohY" + }, + "source": [ + "# Install Java, Spark, and Findspark\n", + "This installs Apache Spark 2.3.2, Java 8, and [Findspark](https://github.com/minrk/findspark), a library that makes it easy for Python to find Spark." + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "fUhBhrGmyAvs" + }, + "outputs": [], + "source": [ + "!apt-get install openjdk-8-jdk-headless -qq > /dev/null\n", + "!wget -q http://www-eu.apache.org/dist/spark/spark-2.4.4/spark-2.4.4-bin-hadoop2.7.tgz\n", + "!tar xf spark-2.4.4-bin-hadoop2.7.tgz\n", + "!pip install -q findspark" + ] + }, + { + "cell_type": "code", + "execution_count": 103, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 68 + }, + "colab_type": "code", + "id": "5hhXcL2PLMGu", + "outputId": "0771bcc4-a25d-46e1-eae4-25f9fb263e29" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: py4j in /usr/local/lib/python3.6/dist-packages (0.10.7)\n", + "Requirement already satisfied: pyspark in /usr/local/lib/python3.6/dist-packages (2.4.4)\n", + "Requirement already satisfied: py4j==0.10.7 in /usr/local/lib/python3.6/dist-packages (from pyspark) (0.10.7)\n" + ] + } + ], + "source": [ + "!pip install py4j\n", + "!pip install pyspark" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "b4Kjvk_h1AHl" + }, + "source": [ + "# Set Environment Variables\n", + "Set the locations where Spark and Java are installed." + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "8Xnb_ePUyQIL" + }, + "outputs": [], + "source": [ + "import os\n", + "os.environ[\"JAVA_HOME\"] = \"/usr/lib/jvm/java-8-openjdk-amd64\"\n", + "os.environ[\"SPARK_HOME\"] = \"/content/spark-2.4.4-bin-hadoop2.7\"" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "NwU28K5f1H3P" + }, + "source": [ + "# Start a SparkSession\n", + "This will start a local Spark session." + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "lsMpgjgaAbuI" + }, + "outputs": [], + "source": [ + "import os\n", + "import time" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "b3xI5hrK_p4l" + }, + "outputs": [], + "source": [ + "# spark imports\n", + "from pyspark.sql import SparkSession\n", + "from pyspark.sql.functions import UserDefinedFunction, explode, desc\n", + "from pyspark.sql.types import StringType, ArrayType\n", + "from pyspark.mllib.recommendation import ALS" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "q-m8p5V9AeSp" + }, + "outputs": [], + "source": [ + "# data science imports\n", + "import math\n", + "import numpy as np\n", + "import pandas as pd\n", + "\n", + "# visualization imports\n", + "import seaborn as sns\n", + "import matplotlib.pyplot as plt\n", + "\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "zgReRGl0y23D" + }, + "outputs": [], + "source": [ + "import findspark\n", + "findspark.init(\"spark-2.4.4-bin-hadoop2.7\")# SPARK_HOME\n", + "\n", + "from pyspark.sql import SparkSession\n", + "spark = SparkSession.builder.master(\"local[*]\").getOrCreate()" + ] + }, + { + "cell_type": "code", + "execution_count": 109, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "colab_type": "code", + "id": "7kI3tH14nyTG", + "outputId": "30862113-2b9f-4788-ecb8-fb0da28fd64f" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Drive already mounted at /content/gdrive; to attempt to forcibly remount, call drive.mount(\"/content/gdrive\", force_remount=True).\n" + ] + } + ], + "source": [ + "from google.colab import drive\n", + "drive.mount('/content/gdrive')" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "PacPhfuan_6r" + }, + "outputs": [], + "source": [ + "!cp /content/gdrive/My\\ Drive/MscsDs/msdchallenge/kaggle_visible_evaluation_triplets.txt ." + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "3q9GWx_2oFLS" + }, + "outputs": [], + "source": [ + "!cp -r /content/gdrive/My\\ Drive/MscsDs/MSongsDB-master/PythonSrc ." + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "pyiYETN8oQbG" + }, + "outputs": [], + "source": [ + "# ! cd /content/gdrive/My\\ Drive/MscsDs/ && tar -zxvf millionsongsubset_full.tar.gz" + ] + }, + { + "cell_type": "code", + "execution_count": 112, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 204 + }, + "colab_type": "code", + "id": "MDD5vViroUvk", + "outputId": "5455583c-d3f8-4596-cef6-9c592942a26f" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
user_idsong_idsplay_count
0fd50c4007b68a3737fe052d5a4f78ce8aa117f3dSOBONKR12A58A7A7E01
1fd50c4007b68a3737fe052d5a4f78ce8aa117f3dSOEGIYH12A6D4FC0E31
2fd50c4007b68a3737fe052d5a4f78ce8aa117f3dSOFLJQZ12A6D4FADA61
3fd50c4007b68a3737fe052d5a4f78ce8aa117f3dSOHTKMO12AB01843B01
4fd50c4007b68a3737fe052d5a4f78ce8aa117f3dSODQZCY12A6D4F9D111
\n", + "
" + ], + "text/plain": [ + " user_id song_ids play_count\n", + "0 fd50c4007b68a3737fe052d5a4f78ce8aa117f3d SOBONKR12A58A7A7E0 1\n", + "1 fd50c4007b68a3737fe052d5a4f78ce8aa117f3d SOEGIYH12A6D4FC0E3 1\n", + "2 fd50c4007b68a3737fe052d5a4f78ce8aa117f3d SOFLJQZ12A6D4FADA6 1\n", + "3 fd50c4007b68a3737fe052d5a4f78ce8aa117f3d SOHTKMO12AB01843B0 1\n", + "4 fd50c4007b68a3737fe052d5a4f78ce8aa117f3d SODQZCY12A6D4F9D11 1" + ] + }, + "execution_count": 112, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "users = pd.read_table('./kaggle_visible_evaluation_triplets.txt', sep='\\t', names= ['user_id','song_ids','play_count'])\n", + "users.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 113, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 255 + }, + "colab_type": "code", + "id": "hwFRfTFypgyK", + "outputId": "edf18945-b6ec-4fb7-a854-61cca652a23a" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " user_id ... play_count\n", + "0 fd50c4007b68a3737fe052d5a4f78ce8aa117f3d ... 1\n", + "1 fd50c4007b68a3737fe052d5a4f78ce8aa117f3d ... 1\n", + "2 fd50c4007b68a3737fe052d5a4f78ce8aa117f3d ... 1\n", + "3 fd50c4007b68a3737fe052d5a4f78ce8aa117f3d ... 1\n", + "4 fd50c4007b68a3737fe052d5a4f78ce8aa117f3d ... 1\n", + "... ... ... ...\n", + "1450928 5e650759ebf89012044c6d52121eeada8b0ec814 ... 1\n", + "1450929 5e650759ebf89012044c6d52121eeada8b0ec814 ... 2\n", + "1450930 5e650759ebf89012044c6d52121eeada8b0ec814 ... 2\n", + "1450931 5e650759ebf89012044c6d52121eeada8b0ec814 ... 2\n", + "1450932 5e650759ebf89012044c6d52121eeada8b0ec814 ... 3\n", + "\n", + "[1450933 rows x 3 columns]\n" + ] + } + ], + "source": [ + "from pandas import DataFrame\n", + "\n", + "temp = DataFrame(users, columns= ['user_id', 'song_ids','play_count'])\n", + "export_csv = temp.to_csv (r'./triplets.csv', index = None, header=True)\n", + "print(temp)" + ] + }, + { + "cell_type": "code", + "execution_count": 114, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 390 + }, + "colab_type": "code", + "id": "nWV9yDHGyOUl", + "outputId": "756718d4-1075-4346-f270-823bcdaba313" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
song_idssong_id_code
0SOBONKR12A58A7A7E010546
1SOEGIYH12A6D4FC0E328684
2SOFLJQZ12A6D4FADA636622
3SOHTKMO12AB01843B051861
4SODQZCY12A6D4F9D1124663
5SOXLOQG12AF72A2D55148312
6SOUVUHC12A67020E3B133075
7SOUQERE12A58A75633131771
8SOIPJAX12A8C141A2D57332
9SOEFCDJ12AB0185FA028367
10SOATCSU12A8C13393A4975
\n", + "
" + ], + "text/plain": [ + " song_ids song_id_code\n", + "0 SOBONKR12A58A7A7E0 10546\n", + "1 SOEGIYH12A6D4FC0E3 28684\n", + "2 SOFLJQZ12A6D4FADA6 36622\n", + "3 SOHTKMO12AB01843B0 51861\n", + "4 SODQZCY12A6D4F9D11 24663\n", + "5 SOXLOQG12AF72A2D55 148312\n", + "6 SOUVUHC12A67020E3B 133075\n", + "7 SOUQERE12A58A75633 131771\n", + "8 SOIPJAX12A8C141A2D 57332\n", + "9 SOEFCDJ12AB0185FA0 28367\n", + "10 SOATCSU12A8C13393A 4975" + ] + }, + "execution_count": 114, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "from sklearn.preprocessing import LabelEncoder\n", + "\n", + "frame = temp\n", + "lb_make = LabelEncoder()\n", + "frame[\"user_id_code\"] = lb_make.fit_transform(frame[\"user_id\"])\n", + "frame[[\"user_id\", \"user_id_code\"]].head(11)\n", + "\n", + "lb_make2 = LabelEncoder()\n", + "frame[\"song_id_code\"] = lb_make2.fit_transform(frame[\"song_ids\"])\n", + "frame[[\"song_ids\", \"song_id_code\"]].head(11)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 116, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 419 + }, + "colab_type": "code", + "id": "urnaD1IpyZZ6", + "outputId": "6103c07a-bb7c-4268-9234-f11dcf71c2f1" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
user_idsong_idsplay_countuser_id_codesong_id_code
0fd50c4007b68a3737fe052d5a4f78ce8aa117f3dSOBONKR12A58A7A7E0110881110546
1fd50c4007b68a3737fe052d5a4f78ce8aa117f3dSOEGIYH12A6D4FC0E3110881128684
2fd50c4007b68a3737fe052d5a4f78ce8aa117f3dSOFLJQZ12A6D4FADA6110881136622
3fd50c4007b68a3737fe052d5a4f78ce8aa117f3dSOHTKMO12AB01843B0110881151861
4fd50c4007b68a3737fe052d5a4f78ce8aa117f3dSODQZCY12A6D4F9D11110881124663
..................
14509285e650759ebf89012044c6d52121eeada8b0ec814SOVLNXV12A6D4F706E140490136574
14509295e650759ebf89012044c6d52121eeada8b0ec814SOVDSJC12A58A7A271240490134757
14509305e650759ebf89012044c6d52121eeada8b0ec814SOBRHVR12A8C133F3524049011310
14509315e650759ebf89012044c6d52121eeada8b0ec814SOMGVYU12A8C1314FF24049080823
14509325e650759ebf89012044c6d52121eeada8b0ec814SOTCMDJ12A6D4F8528340490122750
\n", + "

1450933 rows × 5 columns

\n", + "
" + ], + "text/plain": [ + " user_id ... song_id_code\n", + "0 fd50c4007b68a3737fe052d5a4f78ce8aa117f3d ... 10546\n", + "1 fd50c4007b68a3737fe052d5a4f78ce8aa117f3d ... 28684\n", + "2 fd50c4007b68a3737fe052d5a4f78ce8aa117f3d ... 36622\n", + "3 fd50c4007b68a3737fe052d5a4f78ce8aa117f3d ... 51861\n", + "4 fd50c4007b68a3737fe052d5a4f78ce8aa117f3d ... 24663\n", + "... ... ... ...\n", + "1450928 5e650759ebf89012044c6d52121eeada8b0ec814 ... 136574\n", + "1450929 5e650759ebf89012044c6d52121eeada8b0ec814 ... 134757\n", + "1450930 5e650759ebf89012044c6d52121eeada8b0ec814 ... 11310\n", + "1450931 5e650759ebf89012044c6d52121eeada8b0ec814 ... 80823\n", + "1450932 5e650759ebf89012044c6d52121eeada8b0ec814 ... 122750\n", + "\n", + "[1450933 rows x 5 columns]" + ] + }, + "execution_count": 116, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "frame" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "CQaWupmeyiWr" + }, + "outputs": [], + "source": [ + "export_csv = frame.to_csv (r'./triplets.csv', index = None, header=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "r-8o3ceGpgiM" + }, + "outputs": [], + "source": [ + "# spark imports\n", + "from pyspark.ml.feature import StringIndexer\n", + "from pyspark.ml import Pipeline\n", + "from pyspark.sql.functions import col\n", + "from pyspark.ml.evaluation import RegressionEvaluator\n", + "from pyspark.ml.recommendation import ALS\n", + "from pyspark.sql import SparkSession\n", + "from pyspark.sql.functions import UserDefinedFunction, explode, desc\n", + "from pyspark.sql.types import StringType, ArrayType" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "-d4BjZ-ipoVm" + }, + "outputs": [], + "source": [ + "spark = SparkSession \\\n", + " .builder \\\n", + " .appName(\"Music Recommender System\") \\\n", + " .config(\"spark.driver.maxResultSize\", \"96g\") \\\n", + " .config(\"spark.driver.memory\", \"96g\") \\\n", + " .config(\"spark.executor.memory\", \"8g\") \\\n", + " .config(\"spark.master\", \"local[12]\") \\\n", + " .getOrCreate()\n", + "# get spark context\n", + "sc = spark.sparkContext" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 289 + }, + "colab_type": "code", + "id": "85GstFIJpqHy", + "outputId": "595f1bfc-ab43-4c00-c7c7-626a5abd8ef1" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+----------------------------------------+------------------+----------+------------+------------+\n", + "|user_id |song_ids |play_count|user_id_code|song_id_code|\n", + "+----------------------------------------+------------------+----------+------------+------------+\n", + "|fd50c4007b68a3737fe052d5a4f78ce8aa117f3d|SOBONKR12A58A7A7E0|1 |108811 |10546 |\n", + "|fd50c4007b68a3737fe052d5a4f78ce8aa117f3d|SOEGIYH12A6D4FC0E3|1 |108811 |28684 |\n", + "|fd50c4007b68a3737fe052d5a4f78ce8aa117f3d|SOFLJQZ12A6D4FADA6|1 |108811 |36622 |\n", + "|fd50c4007b68a3737fe052d5a4f78ce8aa117f3d|SOHTKMO12AB01843B0|1 |108811 |51861 |\n", + "|fd50c4007b68a3737fe052d5a4f78ce8aa117f3d|SODQZCY12A6D4F9D11|1 |108811 |24663 |\n", + "|fd50c4007b68a3737fe052d5a4f78ce8aa117f3d|SOXLOQG12AF72A2D55|1 |108811 |148312 |\n", + "|d7083f5e1d50c264277d624340edaaf3dc16095b|SOUVUHC12A67020E3B|1 |92390 |133075 |\n", + "|d7083f5e1d50c264277d624340edaaf3dc16095b|SOUQERE12A58A75633|1 |92390 |131771 |\n", + "|d7083f5e1d50c264277d624340edaaf3dc16095b|SOIPJAX12A8C141A2D|1 |92390 |57332 |\n", + "|d7083f5e1d50c264277d624340edaaf3dc16095b|SOEFCDJ12AB0185FA0|2 |92390 |28367 |\n", + "+----------------------------------------+------------------+----------+------------+------------+\n", + "only showing top 10 rows\n", + "\n" + ] + } + ], + "source": [ + "df = spark.read.load('./triplets.csv', format='csv', header=True, inferSchema=True)\n", + "df.show(10, truncate=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "-w67_jL8qQTo" + }, + "outputs": [], + "source": [ + "# indexer = [StringIndexer(inputCol=column, outputCol=column+\"_index\") for column in list(set(df.columns)-set(['overall'])) ]\n", + "# pipeline = Pipeline(stages=indexer)\n", + "# transformed = pipeline.fit(df).transform(df)\n", + "# transformed.show(truncate=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "zvofnE_gR8UM" + }, + "outputs": [], + "source": [ + "# user = list(transformed.select('user_id_index').distinct().sort(transformed[\"user_id_index\"])) # Get our unique customers\n", + "# song = list(transformed.select('song_ids_index').distinct().sort(transformed[\"song_ids_index\"])) # Get our unique products that were purchased\n", + "# playCount = list(transformed.select('play_count')) # All of our purchases\n", + "\n", + "# # rows = transformed.select('user_id_index').astype('category', categories = user).cat.codes \n", + "# # # Get the associated row indices\n", + "# # cols = transformed.song_ids_index.astype('category', categories = song).cat.codes \n", + "# # Get the associated column indices\n", + "# # playCount_sparse = sparse.csr_matrix((playCount, (user, song)), shape=(len(user), len(song)))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "OV2o-FcW_1Td" + }, + "outputs": [], + "source": [ + "(training,test)=df.randomSplit([0.8, 0.2])" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "dVzUftH1UwtU" + }, + "outputs": [], + "source": [ + "als=ALS(maxIter=5, regParam=0.09,rank=25,userCol=\"user_id_code\",itemCol=\"song_id_code\",ratingCol=\"play_count\",coldStartStrategy=\"drop\",nonnegative=True)\n", + "model=als.fit(training)" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 969 + }, + "colab_type": "code", + "id": "AUHd8hwJV3OD", + "outputId": "9fc3b00e-1c28-4dea-addc-b9f9f22bdacf" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+----------------------------------------+------------------+----------+------------+------------+----------+\n", + "|user_id |song_ids |play_count|user_id_code|song_id_code|prediction|\n", + "+----------------------------------------+------------------+----------+------------+------------+----------+\n", + "|8982c3890ef7a2978292a3c986e61cb914723261|SOAAOQV12A58A7FDFA|1 |59044 |148 |1.0275742 |\n", + "|19faa693156a63d3956f9bea38bd1ef594249144|SOABVCK12A6D4F8A92|2 |11215 |471 |0.5101284 |\n", + "|ba6186342cce189527238d6961d782a78982ae8f|SOABVCK12A6D4F8A92|2 |80079 |471 |0.30069754|\n", + "|cae426aea0ddb4132d197c6ca6ff8281d75a4954|SOADGAX12A8151B896|2 |87115 |833 |1.0532596 |\n", + "|cab90d247ebe4fa99117b686e40acbfd58ca2ca0|SOAKBZR12AC468D1DD|1 |87050 |2659 |1.1064874 |\n", + "|8439c1a5fbd468d956fceb15a7495c08bc51c54c|SOAOGOV12A8C13ACED|7 |56813 |3749 |0.71650064|\n", + "|55b972d3bd087312c570bf501c411412c6b49665|SOAOGOV12A8C13ACED|1 |36784 |3749 |0.38686666|\n", + "|9a336136b35549aeca2ecc0d68e5cf5cbc32455f|SOAOGOV12A8C13ACED|1 |66134 |3749 |1.3442959 |\n", + "|dc7a1da974ed898e356d3277970ac9d4c8bc478d|SOAOGOV12A8C13ACED|1 |94737 |3749 |1.3043659 |\n", + "|56e27943491cedc2eb4a505a080def6a5068fdf0|SOAOGOV12A8C13ACED|1 |37259 |3749 |0.29489112|\n", + "|ab428a3ce64b66fc4ab37801b126c90de5b46b4b|SOAOGOV12A8C13ACED|3 |73494 |3749 |3.8756835 |\n", + "|9d9e0e02d02ccdbe747d760d4840d4ae02519902|SOAOGOV12A8C13ACED|1 |67657 |3749 |2.662067 |\n", + "|b1da390ea4cfeb03d9e80abcc28c0b0631c6b975|SOAOGOV12A8C13ACED|2 |76345 |3749 |2.692673 |\n", + "|6615f72ac5a32426a6a528cd22685a08115a9d18|SOAOGOV12A8C13ACED|1 |43813 |3749 |1.3359375 |\n", + "|f6b6d11dc93a20d976c195f670781952ad505d27|SOARGYR12A6D4F90C7|1 |105899 |4519 |0.6676656 |\n", + "|07c48483fe7d14ce1ca64f38f413dc6dd4a76022|SOARGYR12A6D4F90C7|3 |3374 |4519 |0.87244946|\n", + "|950fbfeccbc60ade6ed5964b8d324d3fed9be7c8|SOARGYR12A6D4F90C7|5 |63946 |4519 |1.4610394 |\n", + "|7fba40fcf9a21f7bb0143f947d935b5947a51759|SOARGYR12A6D4F90C7|1 |54810 |4519 |1.7686548 |\n", + "|8d06f67ebf98f3685726346b182812e01baccbf0|SOARGYR12A6D4F90C7|5 |60544 |4519 |2.030398 |\n", + "|1ed19063a4f3f3ecaa4874ea4eafb63c49783e81|SOAVBMC12A6D4F745A|1 |13258 |5518 |1.7134204 |\n", + "|0d7b286cd669f1078da7da82b650686e398791fd|SOAYQAJ12A67AE123E|1 |5830 |6466 |0.33060303|\n", + "|b39dfda8466831031ccf4f48ed8857a858f2f17c|SOBBSNN12AF72A9C42|1 |77139 |7253 |1.0974667 |\n", + "|388f7b7150bd020ce59b82603f7dd29f590ff8ed|SOBCAQT12A6702123E|1 |24383 |7340 |1.00141 |\n", + "|82436cfc62dd21607c1d60a00ad7db7e4135f32f|SOBDROL12A6D4F9EED|1 |55924 |7754 |2.3457708 |\n", + "|b0e27370b66a67cf83d5562d293dabd4311add5f|SOBFARY12A6310E34F|1 |75943 |8086 |0.89488906|\n", + "|64aa07e24cab5618c80bdc076916190024d83f39|SOBHFYO12A6D4FAC8D|1 |43231 |8638 |1.4804353 |\n", + "|dbfee1e9a3d1cc23a2453d56d0ff3e9162ea5b38|SOBMFOX12A6D4F5B86|1 |94550 |9900 |0.8885433 |\n", + "|360d6dff96604c2cce95c3383d9b70c2a066ba8d|SOBNHMD12A67ADADA3|1 |23311 |10206 |1.1336254 |\n", + "|254f817243dbd2539256bf456aa9036f5379b654|SOBNHMD12A67ADADA3|1 |16064 |10206 |2.2536728 |\n", + "|3069c3d629d106d80a222cedb4a20361761ef132|SOBNHMD12A67ADADA3|1 |20929 |10206 |0.88243246|\n", + "|9b52e895436a0aa8f1290cf863a0994ac58de52e|SOBNHMD12A67ADADA3|1 |66644 |10206 |1.2767642 |\n", + "|e57715de18deb3245af1b1e751b06929f0d58d70|SOBNHMD12A67ADADA3|1 |98575 |10206 |1.2492512 |\n", + "|39ee1eff10a5c48be44f103f592374d53c692dfa|SOBNHMD12A67ADADA3|1 |25031 |10206 |1.0494484 |\n", + "|a0044a2450e744509e42a696e90c5b75f5f36af3|SOBNHMD12A67ADADA3|1 |68699 |10206 |0.7490436 |\n", + "|6e93172f31b8240b848a980036b721e5d4e56a02|SOBOUPA12A6D4F81F1|9 |47501 |10623 |0.38634884|\n", + "|61338bbdf424e8f8f986ef8f1315aa4df5476a1d|SOBOUPA12A6D4F81F1|1 |41704 |10623 |0.18352605|\n", + "|99a61c348645b8153dcc9982ec3853d5a08da0e1|SOBOUPA12A6D4F81F1|1 |65905 |10623 |4.766694 |\n", + "|10d63816e42097e44b2b05e2f62ef3b3acebe0ee|SOBOUPA12A6D4F81F1|1 |7281 |10623 |2.4408543 |\n", + "|346e890cd7f82b0386ec8d971004b9252c083455|SOBOUPA12A6D4F81F1|1 |22609 |10623 |4.8452806 |\n", + "|053b73c5c8b38f195ecab4a6858c832f18e52876|SOBOUPA12A6D4F81F1|3 |2259 |10623 |3.497225 |\n", + "|327712b9a51091c064b3ded8c63569722e808f0b|SOBOUPA12A6D4F81F1|1 |21769 |10623 |0.91443443|\n", + "|2fe09ed614ae7b3e5e1e991b0c42636a93fa5aca|SOBOUPA12A6D4F81F1|38 |20671 |10623 |2.1283727 |\n", + "|4ae4df63d5d70b291dd507da656acf7676105bd4|SOBOUPA12A6D4F81F1|3 |32199 |10623 |1.3279399 |\n", + "|92e22578b1dd365da69bf87cd197bfdfb3841a9e|SOBOUPA12A6D4F81F1|1 |63033 |10623 |0.66111124|\n", + "|cf7f599565576f0d0d64fba61227d32966601365|SOBOUPA12A6D4F81F1|2 |89109 |10623 |1.5132858 |\n", + "|f7b899ab523efde466a1774c4961852938d5f1af|SOBOUPA12A6D4F81F1|3 |106347 |10623 |3.5346136 |\n", + "|1fe40010162258712013a9a466324f491a3ad288|SOBOUPA12A6D4F81F1|5 |13701 |10623 |2.0195777 |\n", + "|d0f781e47e4777b4bac0c77dd6c170eb833bf068|SOBOUPA12A6D4F81F1|2 |89772 |10623 |1.8618262 |\n", + "|81c301ce91b185cea96b633e3105887ae4a72fe1|SOBOUPA12A6D4F81F1|9 |55704 |10623 |3.842008 |\n", + "|9d8e4741ca9d8e78acd7b3081d022a4bbacd955c|SOBOUPA12A6D4F81F1|1 |67628 |10623 |1.1754149 |\n", + "+----------------------------------------+------------------+----------+------------+------------+----------+\n", + "only showing top 50 rows\n", + "\n" + ] + } + ], + "source": [ + "evaluator=RegressionEvaluator(metricName=\"rmse\",labelCol=\"play_count\",predictionCol=\"prediction\")\n", + "predictions=model.transform(test)\n", + "predictions.show(50, truncate = False)" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "ELdFbYzQN6mO" + }, + "outputs": [], + "source": [ + "# rmse = evaluator.evaluate(predictions)" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "uIG74SmqaVmo" + }, + "outputs": [], + "source": [ + "# print(\"Root-mean-square error = \" + str(rmse))" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 309 + }, + "colab_type": "code", + "id": "ZkcnWBalB84v", + "outputId": "efe636ea-059e-4ec8-a37b-ea0f7b5a6be0" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+-------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", + "|user_id_index|recommendations |\n", + "+-------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", + "|148 |[[132559, 128.63263], [147680, 83.976524], [66419, 82.88117], [125845, 76.72285], [82226, 76.19292], [39411, 76.14007], [162509, 75.64509], [99909, 63.91176], [98323, 63.563046], [117480, 62.751663]] |\n", + "|463 |[[50694, 81.836334], [39411, 64.48308], [147680, 64.23534], [122151, 61.286102], [91642, 56.230762], [18266, 45.621635], [132559, 45.549026], [162509, 43.640633], [125845, 39.744972], [28504, 38.03746]] |\n", + "|471 |[[91642, 166.9629], [90521, 82.83951], [118079, 81.80899], [90425, 70.81573], [28504, 69.14364], [125845, 65.72644], [130593, 63.165348], [147680, 60.90121], [123867, 60.728004], [116217, 54.02317]] |\n", + "|496 |[[98323, 561.9435], [159673, 237.96635], [29924, 204.07669], [130289, 202.01738], [162509, 188.40092], [64530, 180.07327], [96723, 176.96783], [47412, 176.5399], [117683, 176.40698], [94070, 173.90211]] |\n", + "|833 |[[125845, 261.29282], [162509, 211.07877], [91642, 209.26482], [90521, 200.1382], [39411, 183.05717], [132559, 174.52623], [50694, 170.21997], [147680, 165.52065], [82226, 135.1852], [93177, 130.17105]] |\n", + "|1088 |[[91642, 477.74738], [132559, 301.17938], [98323, 163.98624], [123867, 163.49843], [130593, 150.79263], [147680, 148.13669], [28504, 145.4549], [90521, 139.62958], [162509, 136.77386], [122151, 136.32388]]|\n", + "|1238 |[[18266, 157.90025], [91642, 144.36684], [50694, 119.0692], [122151, 78.154465], [11315, 73.731895], [62883, 68.069824], [36371, 66.961914], [154520, 66.59154], [9336, 64.87565], [63740, 64.10445]] |\n", + "|1342 |[[132559, 215.22742], [32380, 146.98671], [123867, 143.82867], [40945, 137.36111], [117480, 121.496414], [36371, 117.13508], [91642, 107.41648], [21660, 107.31862], [98323, 104.51557], [46713, 104.25622]] |\n", + "|1580 |[[132559, 347.78375], [98323, 195.82375], [159673, 132.96431], [51399, 103.85994], [64530, 102.61894], [162509, 90.60711], [90425, 89.49118], [23038, 87.83676], [36371, 78.12712], [36489, 73.4358]] |\n", + "|1591 |[[50694, 125.0975], [122151, 99.453705], [88869, 85.341286], [132559, 70.60342], [91642, 66.271194], [80202, 65.54762], [147680, 63.61119], [162509, 47.968006], [66419, 47.93394], [47290, 46.066273]] |\n", + "+-------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", + "only showing top 10 rows\n", + "\n" + ] + } + ], + "source": [ + "# user_recs=model.recommendForAllUsers(10).show(10, truncate = False)" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "skM3poAyKgfu" + }, + "outputs": [], + "source": [ + "recs=model.recommendForAllUsers(10).toPandas()" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 419 + }, + "colab_type": "code", + "id": "7AiEvI4Bmnh3", + "outputId": "2e860d9a-f71f-4dbc-c8d1-c56cb64b77ee" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
user_id_coderecommendations
0148[(86930, 164.18919372558594), (130976, 143.074...
1463[(140084, 59.36147689819336), (20335, 54.54523...
2471[(140084, 346.9989013671875), (20335, 337.6782...
3496[(86930, 102.5612564086914), (20335, 101.52572...
4833[(39155, 280.4085388183594), (130976, 217.9136...
.........
109984108934[(86930, 162.45037841796875), (3934, 160.69415...
109985108946[(140084, 271.0825500488281), (20335, 264.0805...
109986108961[(140084, 114.94924926757812), (20335, 99.6657...
109987109144[(20335, 165.97198486328125), (86930, 129.8025...
109988109297[(20335, 122.2970199584961), (86930, 58.789989...
\n", + "

109989 rows × 2 columns

\n", + "
" + ], + "text/plain": [ + " user_id_code recommendations\n", + "0 148 [(86930, 164.18919372558594), (130976, 143.074...\n", + "1 463 [(140084, 59.36147689819336), (20335, 54.54523...\n", + "2 471 [(140084, 346.9989013671875), (20335, 337.6782...\n", + "3 496 [(86930, 102.5612564086914), (20335, 101.52572...\n", + "4 833 [(39155, 280.4085388183594), (130976, 217.9136...\n", + "... ... ...\n", + "109984 108934 [(86930, 162.45037841796875), (3934, 160.69415...\n", + "109985 108946 [(140084, 271.0825500488281), (20335, 264.0805...\n", + "109986 108961 [(140084, 114.94924926757812), (20335, 99.6657...\n", + "109987 109144 [(20335, 165.97198486328125), (86930, 129.8025...\n", + "109988 109297 [(20335, 122.2970199584961), (86930, 58.789989...\n", + "\n", + "[109989 rows x 2 columns]" + ] + }, + "execution_count": 98, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "recs" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "colab_type": "code", + "id": "P8-lZYvERY3i", + "outputId": "6313c723-56c7-4dc6-dab7-b8997a58a221" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(109989, 2)" + ] + }, + "execution_count": 35, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "recs.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "FZ7pGPqH6KWM" + }, + "outputs": [], + "source": [ + "song_df = pd.read_csv('/content/gdrive/My Drive/MscsDs/MillionSongSubset/msd.csv')" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 615 + }, + "colab_type": "code", + "id": "eTlNUFt46Pe8", + "outputId": "a51c53a8-2c1d-4e32-e8ff-d1b505dd92ab" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Unnamed: 0Unnamed: 0.1song_idssong_titlessong_durationssong_realease_yearsartist_namessong_hotnesssong_temposong_energiessong_danceabilitysong_barssong_beatssong_time_signaturessong_tatumsong_modessong_keysartist_familiartyartist_hotness
000SONHTWP12A8C142744Vals '89162.585670Manolis Famellos & I PodilatesNaN94.3010.00.0[ 1.45502 3.39383 5.32826 7.25953 9.1...[ 0.16441 0.80395 1.45502 2.09102 2.7...3[ 0.16441 0.48418 0.80395 1.13522 1.4...100.2287300.000000
111SOPIHMB12AC468E0DDGhost of the Ocean (Live)214.255870Uriah Heep0.2502149.9210.00.0[ 1.20218 2.80457 4.39266 5.98514 7.5...[ 0.38752 0.79653 1.20218 1.60244 2.0...4[ 0.2523 0.38752 0.52273 ... 212.97102 2...170.6732390.479205
222SODRPJT12AC468DEF1The frog song169.873830Alain-FrançoisNaN136.0440.00.0[ 1.37397 4.48312 7.56804 10.65675 13.7...[ 0.48609 0.93058 1.37397 1.81958 2.2...7[ 0.26328 0.48609 0.70778 0.93058 1.1...120.3803170.300918
333SOLLOTO12AB01804C6Deep Blue Sea (Daniel Rossen home recording)351.503222008Grizzly BearNaN85.0030.00.0[ 0.72449 3.55798 6.37712 9.20176 12.0...[ 0.72449 1.43405 2.1445 2.85228 3.5...4[1.8653000e-01 3.6881000e-01 5.4665000e-01 ......190.7606360.547244
444SOCNYGS12AB01832B8La vérité252.446892007Annie Blanchard0.0000113.2870.00.0[2.2334000e-01 2.3324800e+00 4.4484000e+00 6.5...[2.2334000e-01 7.5000000e-01 1.2775800e+00 1.8...4[2.2334000e-01 3.9890000e-01 5.7445000e-01 ......150.4797350.352460
\n", + "
" + ], + "text/plain": [ + " Unnamed: 0 Unnamed: 0.1 ... artist_familiarty artist_hotness\n", + "0 0 0 ... 0.228730 0.000000\n", + "1 1 1 ... 0.673239 0.479205\n", + "2 2 2 ... 0.380317 0.300918\n", + "3 3 3 ... 0.760636 0.547244\n", + "4 4 4 ... 0.479735 0.352460\n", + "\n", + "[5 rows x 19 columns]" + ] + }, + "execution_count": 46, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "song_df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 119, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 119 + }, + "colab_type": "code", + "id": "yhmzMcDr9syW", + "outputId": "6d141ba2-5c07-4906-d7a1-92aa0af09438" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Recommendation to user 148 : \n", + " Song: Seed Will Grow\n", + " Artist: Ms. Dynamite / Kymani Marley\n", + " Recommendation to user 1088 : \n", + " Song: Till There Was You (John Creamer & Stephane K Remix)\n", + " Artist: Rachael Starr\n" + ] + } + ], + "source": [ + "count = 0\n", + "song_id_found = set()\n", + "for recValue in recs.values:\n", + " for item in recValue[1]:\n", + " row = frame.loc[frame['song_id_code'] == item.song_id_code]\n", + " song_id = row.song_ids.values[0]\n", + " if ( song_id not in song_id_found) and (song_df.loc[ song_df['song_ids'] == song_id].shape[0] == 1):\n", + " rowDetails = song_df.loc[ song_df['song_ids'] == song_id]\n", + " print(\" Recommendation to user \", recValue[0], \" : \")\n", + " print(\" Song: \", rowDetails.song_titles.values[0]) \n", + " print(\" Artist: \", rowDetails.artist_names.values[0])\n", + " song_id_found.add(song_id)\n", + " count += 1\n", + " \n", + " if count > 1:\n", + " break" + ] + }, + { + "cell_type": "code", + "execution_count": 118, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 408 + }, + "colab_type": "code", + "id": "WyW00de2BjBT", + "outputId": "b1a5fc1b-b9e8-44b3-8954-55c47111051a" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Recommendation to user 148 : \n", + "\n", + " Song ID: SONGFCZ12AB01859AD\n", + "\n", + " Song ID: SOUMPJA12AAF3B3FD0\n", + "\n", + " Song ID: SOUEXOI12AB0189BA4\n", + "\n", + " Song ID: SODALYQ12AB017EED4\n", + "\n", + " Song ID: SOWAWSK12A8C1383B2\n", + "\n", + " Song ID: SOAOXTG12A67021AA7\n", + " Song: Seed Will Grow\n", + " Artist: Ms. Dynamite / Kymani Marley\n", + "\n", + " Song ID: SODJYMH12A8AE46EA5\n", + "\n", + " Song ID: SOTFIZA12A8C13D80F\n", + "\n", + " Song ID: SORJSQI12A6701D62D\n", + "\n", + " Song ID: SOXTUWG12AB018A2E2\n" + ] + } + ], + "source": [ + "print(\" Recommendation to user 148 : \")\n", + "for recom in recs.query('user_id_code == 148').recommendations:\n", + " for item in recom:\n", + " row = frame.loc[frame['song_id_code'] == item.song_id_code]\n", + " print(\"\\n Song ID: \", row.song_ids.values[0])\n", + " song_id = row.song_ids.values[0]\n", + " if song_df.loc[ song_df['song_ids'] == song_id].shape[0] == 1:\n", + " rowDetails = song_df.loc[ song_df['song_ids'] == song_id]\n", + " print(\" Song: \", rowDetails.song_titles.values[0]) \n", + " print(\" Artist: \", rowDetails.artist_names.values[0])" + ] + }, + { + "cell_type": "code", + "execution_count": 117, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 374 + }, + "colab_type": "code", + "id": "KgKOnwXg7xXH", + "outputId": "d1e0ad70-bee1-4b3b-c349-fcd20fc8c8da" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Recommendation to user 108811 : \n", + "\n", + " Song ID: SONGFCZ12AB01859AD\n", + "\n", + " Song ID: SODALYQ12AB017EED4\n", + "\n", + " Song ID: SOUMPJA12AAF3B3FD0\n", + "\n", + " Song ID: SOFVLYV12A8C145D8F\n", + "\n", + " Song ID: SOTFIZA12A8C13D80F\n", + "\n", + " Song ID: SOUEXOI12AB0189BA4\n", + "\n", + " Song ID: SORJSQI12A6701D62D\n", + "\n", + " Song ID: SOWAWSK12A8C1383B2\n", + "\n", + " Song ID: SOJLDIQ12A58A7E506\n", + "\n", + " Song ID: SOLLPYO12A8C13B38C\n" + ] + } + ], + "source": [ + "print(\" Recommendation to user 108811 : \")\n", + "for recom in recs.query('user_id_code == 108811').recommendations:\n", + " for item in recom:\n", + " row = frame.loc[frame['song_id_code'] == item.song_id_code]\n", + " print(\"\\n Song ID: \", row.song_ids.values[0])\n", + " song_id = row.song_ids.values[0]\n", + " if song_df.loc[ song_df['song_ids'] == song_id].shape[0] == 1:\n", + " rowDetails = song_df.loc[ song_df['song_ids'] == song_id]\n", + " print(\" Song: \", rowDetails.song_titles.values[0]) \n", + " print(\" Artist: \", rowDetails.artist_names.values[0])" + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "collapsed_sections": [], + "name": "Spark_ALS.ipynb", + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/Subset_Spark_ALS.html b/Subset_Spark_ALS.html new file mode 100644 index 0000000..d2d902e --- /dev/null +++ b/Subset_Spark_ALS.html @@ -0,0 +1,15098 @@ + + + + +Subset_Spark_ALS + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+
+

Install Java, Spark, and Findspark

This installs Apache Spark 2.3.2, Java 8, and Findspark, a library that makes it easy for Python to find Spark.

+ +
+
+
+
+
+
In [0]:
+
+
+
!apt-get install openjdk-8-jdk-headless -qq > /dev/null
+!wget -q http://www-eu.apache.org/dist/spark/spark-2.4.4/spark-2.4.4-bin-hadoop2.7.tgz
+!tar xf spark-2.4.4-bin-hadoop2.7.tgz
+!pip install -q findspark
+
+ +
+
+
+ +
+
+
+
In [2]:
+
+
+
!pip install py4j
+!pip install pyspark
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
Collecting py4j
+  Downloading https://files.pythonhosted.org/packages/04/de/2d314a921ef4c20b283e1de94e0780273678caac901564df06b948e4ba9b/py4j-0.10.8.1-py2.py3-none-any.whl (196kB)
+     |████████████████████████████████| 204kB 43.3MB/s 
+Installing collected packages: py4j
+Successfully installed py4j-0.10.8.1
+Collecting pyspark
+  Downloading https://files.pythonhosted.org/packages/87/21/f05c186f4ddb01d15d0ddc36ef4b7e3cedbeb6412274a41f26b55a650ee5/pyspark-2.4.4.tar.gz (215.7MB)
+     |████████████████████████████████| 215.7MB 64kB/s 
+Collecting py4j==0.10.7
+  Downloading https://files.pythonhosted.org/packages/e3/53/c737818eb9a7dc32a7cd4f1396e787bd94200c3997c72c1dbe028587bd76/py4j-0.10.7-py2.py3-none-any.whl (197kB)
+     |████████████████████████████████| 204kB 55.2MB/s 
+Building wheels for collected packages: pyspark
+  Building wheel for pyspark (setup.py) ... done
+  Created wheel for pyspark: filename=pyspark-2.4.4-py2.py3-none-any.whl size=216130387 sha256=53fa43efd68d50f78561f4969da5668de7ac38fc64910ef99f251a9199228e49
+  Stored in directory: /root/.cache/pip/wheels/ab/09/4d/0d184230058e654eb1b04467dbc1292f00eaa186544604b471
+Successfully built pyspark
+Installing collected packages: py4j, pyspark
+  Found existing installation: py4j 0.10.8.1
+    Uninstalling py4j-0.10.8.1:
+      Successfully uninstalled py4j-0.10.8.1
+Successfully installed py4j-0.10.7 pyspark-2.4.4
+
+
+
+ +
+
+ +
+
+
+
+

Set Environment Variables

Set the locations where Spark and Java are installed.

+ +
+
+
+
+
+
In [0]:
+
+
+
import os
+os.environ["JAVA_HOME"] = "/usr/lib/jvm/java-8-openjdk-amd64"
+os.environ["SPARK_HOME"] = "/content/spark-2.4.4-bin-hadoop2.7"
+
+ +
+
+
+ +
+
+
+
+

Start a SparkSession

This will start a local Spark session.

+ +
+
+
+
+
+
In [0]:
+
+
+
import os
+import time
+
+ +
+
+
+ +
+
+
+
In [0]:
+
+
+
# spark imports
+from pyspark.sql import SparkSession
+from pyspark.sql.functions import UserDefinedFunction, explode, desc
+from pyspark.sql.types import StringType, ArrayType
+from pyspark.mllib.recommendation import ALS
+
+ +
+
+
+ +
+
+
+
In [0]:
+
+
+
# data science imports
+import math
+import numpy as np
+import pandas as pd
+
+# visualization imports
+import seaborn as sns
+import matplotlib.pyplot as plt
+
+%matplotlib inline
+
+ +
+
+
+ +
+
+
+
In [0]:
+
+
+
import findspark
+findspark.init("spark-2.4.4-bin-hadoop2.7")# SPARK_HOME
+
+from pyspark.sql import SparkSession
+spark = SparkSession.builder.master("local[*]").getOrCreate()
+
+ +
+
+
+ +
+
+
+
In [8]:
+
+
+
from google.colab import drive
+drive.mount('/content/gdrive')
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
Go to this URL in a browser: https://accounts.google.com/o/oauth2/auth?client_id=947318989803-6bn6qk8qdgf4n4g3pfee6491hc0brc4i.apps.googleusercontent.com&redirect_uri=urn%3aietf%3awg%3aoauth%3a2.0%3aoob&response_type=code&scope=email%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdocs.test%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdrive%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdrive.photos.readonly%20https%3a%2f%2fwww.googleapis.com%2fauth%2fpeopleapi.readonly
+
+Enter your authorization code:
+··········
+Mounted at /content/gdrive
+
+
+
+ +
+
+ +
+
+
+
In [0]:
+
+
+
!cp /content/gdrive/My\ Drive/MscsDs/msdchallenge/kaggle_visible_evaluation_triplets.txt .
+
+ +
+
+
+ +
+
+
+
In [0]:
+
+
+
!cp -r /content/gdrive/My\ Drive/MscsDs/MSongsDB-master/PythonSrc .
+
+ +
+
+
+ +
+
+
+
In [0]:
+
+
+
# ! cd /content/gdrive/My\ Drive/MscsDs/ && tar -zxvf millionsongsubset_full.tar.gz
+
+ +
+
+
+ +
+
+
+
In [11]:
+
+
+
users = pd.read_table('./kaggle_visible_evaluation_triplets.txt', sep='\t', names= ['user_id','song_ids','play_count'])
+users.head()
+
+ +
+
+
+ +
+
+ + +
+ +
Out[11]:
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
user_idsong_idsplay_count
0fd50c4007b68a3737fe052d5a4f78ce8aa117f3dSOBONKR12A58A7A7E01
1fd50c4007b68a3737fe052d5a4f78ce8aa117f3dSOEGIYH12A6D4FC0E31
2fd50c4007b68a3737fe052d5a4f78ce8aa117f3dSOFLJQZ12A6D4FADA61
3fd50c4007b68a3737fe052d5a4f78ce8aa117f3dSOHTKMO12AB01843B01
4fd50c4007b68a3737fe052d5a4f78ce8aa117f3dSODQZCY12A6D4F9D111
+
+
+ +
+ +
+
+ +
+
+
+
In [17]:
+
+
+
nd = pd.read_csv('/content/gdrive/My Drive/MscsDs/MillionSongSubset/msd.csv')
+nd=nd[['song_ids','song_titles','artist_names']]
+nd.head()
+
+ +
+
+
+ +
+
+ + +
+ +
Out[17]:
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
song_idssong_titlesartist_names
0SONHTWP12A8C142744Vals '89Manolis Famellos & I Podilates
1SOPIHMB12AC468E0DDGhost of the Ocean (Live)Uriah Heep
2SODRPJT12AC468DEF1The frog songAlain-François
3SOLLOTO12AB01804C6Deep Blue Sea (Daniel Rossen home recording)Grizzly Bear
4SOCNYGS12AB01832B8La véritéAnnie Blanchard
+
+
+ +
+ +
+
+ +
+
+
+
In [0]:
+
+
+
from pandas import DataFrame
+
+temp = DataFrame(users, columns= ['user_id', 'song_ids','play_count'])
+temp = pd.merge(users, nd)
+
+ +
+
+
+ +
+
+
+
In [21]:
+
+
+
temp
+
+ +
+
+
+ +
+
+ + +
+ +
Out[21]:
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
user_idsong_idsplay_countsong_titlesartist_names
0c34670d9c1718361feb93068a853cead3c95b76aSOEHWGF12A6D4F8B2B3Hips Don't Lie (featuring Wyclef Jean)Shakira Featuring Wyclef Jean
1c759e740af57c477fe358e62ad7b3b1f2f113a2fSOEHWGF12A6D4F8B2B6Hips Don't Lie (featuring Wyclef Jean)Shakira Featuring Wyclef Jean
28f6e833948caf895a3281ded74ceb32783916e42SOEHWGF12A6D4F8B2B1Hips Don't Lie (featuring Wyclef Jean)Shakira Featuring Wyclef Jean
38cd07652ccba3754502c8fa8fe809c418fdcdc8fSOEHWGF12A6D4F8B2B2Hips Don't Lie (featuring Wyclef Jean)Shakira Featuring Wyclef Jean
4563e8088cbb8affb096d2334531624a8cf7ff3d2SOEHWGF12A6D4F8B2B5Hips Don't Lie (featuring Wyclef Jean)Shakira Featuring Wyclef Jean
..................
18127a4a85f48a7d787b6e17ed38001abcd032cb87c6aSOKLIMD12A8C145AC31Whiskey on the FireAaron Watson
1812890bac2ccc1660cf444569f3553e6b141d132b2c3SONCEJF12AB018581C1JammingTwinkle Twinkle Little Rock Star
1812946a363f17bd4e07d2c607779877baedafc07e7d7SOKWNWI12A8C13383F1Bianca's Midnight LullabyAl Di Meola
181308ecfca10c16f046ae53634347d6b9029c40425c0SONQKDG12A8C130D961IsabelJuana Molina
18131e43d36faeb14c6982e3721a6503ba8978edb9384SOAWDBP12A8C144CB22Diamond In The RoughSyl Johnson
+

18132 rows × 5 columns

+
+
+ +
+ +
+
+ +
+
+
+
In [22]:
+
+
+
from sklearn.preprocessing import LabelEncoder
+
+frame = temp
+lb_make = LabelEncoder()
+frame["user_id_code"] = lb_make.fit_transform(frame["user_id"])
+frame[["user_id", "user_id_code"]].head(11)
+
+lb_make2 = LabelEncoder()
+frame["song_id_code"] = lb_make2.fit_transform(frame["song_ids"])
+frame[["song_ids", "song_id_code"]].head(11)
+
+ +
+
+
+ +
+
+ + +
+ +
Out[22]:
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
song_idssong_id_code
0SOEHWGF12A6D4F8B2B253
1SOEHWGF12A6D4F8B2B253
2SOEHWGF12A6D4F8B2B253
3SOEHWGF12A6D4F8B2B253
4SOEHWGF12A6D4F8B2B253
5SOEHWGF12A6D4F8B2B253
6SOEHWGF12A6D4F8B2B253
7SOEHWGF12A6D4F8B2B253
8SOEHWGF12A6D4F8B2B253
9SOEHWGF12A6D4F8B2B253
10SOEHWGF12A6D4F8B2B253
+
+
+ +
+ +
+
+ +
+
+
+
In [23]:
+
+
+
frame
+
+ +
+
+
+ +
+
+ + +
+ +
Out[23]:
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
user_idsong_idsplay_countsong_titlesartist_namesuser_id_codesong_id_code
0c34670d9c1718361feb93068a853cead3c95b76aSOEHWGF12A6D4F8B2B3Hips Don't Lie (featuring Wyclef Jean)Shakira Featuring Wyclef Jean12353253
1c759e740af57c477fe358e62ad7b3b1f2f113a2fSOEHWGF12A6D4F8B2B6Hips Don't Lie (featuring Wyclef Jean)Shakira Featuring Wyclef Jean12610253
28f6e833948caf895a3281ded74ceb32783916e42SOEHWGF12A6D4F8B2B1Hips Don't Lie (featuring Wyclef Jean)Shakira Featuring Wyclef Jean8967253
38cd07652ccba3754502c8fa8fe809c418fdcdc8fSOEHWGF12A6D4F8B2B2Hips Don't Lie (featuring Wyclef Jean)Shakira Featuring Wyclef Jean8818253
4563e8088cbb8affb096d2334531624a8cf7ff3d2SOEHWGF12A6D4F8B2B5Hips Don't Lie (featuring Wyclef Jean)Shakira Featuring Wyclef Jean5387253
........................
18127a4a85f48a7d787b6e17ed38001abcd032cb87c6aSOKLIMD12A8C145AC31Whiskey on the FireAaron Watson10359587
1812890bac2ccc1660cf444569f3553e6b141d132b2c3SONCEJF12AB018581C1JammingTwinkle Twinkle Little Rock Star9043703
1812946a363f17bd4e07d2c607779877baedafc07e7d7SOKWNWI12A8C13383F1Bianca's Midnight LullabyAl Di Meola4427604
181308ecfca10c16f046ae53634347d6b9029c40425c0SONQKDG12A8C130D961IsabelJuana Molina8927725
18131e43d36faeb14c6982e3721a6503ba8978edb9384SOAWDBP12A8C144CB22Diamond In The RoughSyl Johnson1438944
+

18132 rows × 7 columns

+
+
+ +
+ +
+
+ +
+
+
+
In [0]:
+
+
+
export_csv = frame.to_csv (r'./triplets.csv', index = None, header=True)
+
+ +
+
+
+ +
+
+
+
In [0]:
+
+
+
# spark imports
+from pyspark.ml.feature import StringIndexer
+from pyspark.ml import Pipeline
+from pyspark.sql.functions import col
+from pyspark.ml.evaluation import RegressionEvaluator
+from pyspark.ml.recommendation import ALS
+from pyspark.sql import SparkSession
+from pyspark.sql.functions import UserDefinedFunction, explode, desc
+from pyspark.sql.types import StringType, ArrayType
+
+ +
+
+
+ +
+
+
+
In [0]:
+
+
+
spark = SparkSession \
+    .builder \
+    .appName("Music Recommender System") \
+    .config("spark.driver.maxResultSize", "96g") \
+    .config("spark.driver.memory", "96g") \
+    .config("spark.executor.memory", "8g") \
+    .config("spark.master", "local[12]") \
+    .getOrCreate()
+# get spark context
+sc = spark.sparkContext
+
+ +
+
+
+ +
+
+
+
In [27]:
+
+
+
df = spark.read.load('./triplets.csv', format='csv', header=True, inferSchema=True)
+df.show(10, truncate=False)
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
+----------------------------------------+------------------+----------+--------------------------------------+-----------------------------+------------+------------+
+|user_id                                 |song_ids          |play_count|song_titles                           |artist_names                 |user_id_code|song_id_code|
++----------------------------------------+------------------+----------+--------------------------------------+-----------------------------+------------+------------+
+|c34670d9c1718361feb93068a853cead3c95b76a|SOEHWGF12A6D4F8B2B|3         |Hips Don't Lie (featuring Wyclef Jean)|Shakira Featuring Wyclef Jean|12353       |253         |
+|c759e740af57c477fe358e62ad7b3b1f2f113a2f|SOEHWGF12A6D4F8B2B|6         |Hips Don't Lie (featuring Wyclef Jean)|Shakira Featuring Wyclef Jean|12610       |253         |
+|8f6e833948caf895a3281ded74ceb32783916e42|SOEHWGF12A6D4F8B2B|1         |Hips Don't Lie (featuring Wyclef Jean)|Shakira Featuring Wyclef Jean|8967        |253         |
+|8cd07652ccba3754502c8fa8fe809c418fdcdc8f|SOEHWGF12A6D4F8B2B|2         |Hips Don't Lie (featuring Wyclef Jean)|Shakira Featuring Wyclef Jean|8818        |253         |
+|563e8088cbb8affb096d2334531624a8cf7ff3d2|SOEHWGF12A6D4F8B2B|5         |Hips Don't Lie (featuring Wyclef Jean)|Shakira Featuring Wyclef Jean|5387        |253         |
+|4a76d0d9066dd57060f34f5d9deab05a0e68c8a5|SOEHWGF12A6D4F8B2B|2         |Hips Don't Lie (featuring Wyclef Jean)|Shakira Featuring Wyclef Jean|4671        |253         |
+|82bc6c3eb139e7b024f085e1077675a4aef12476|SOEHWGF12A6D4F8B2B|1         |Hips Don't Lie (featuring Wyclef Jean)|Shakira Featuring Wyclef Jean|8219        |253         |
+|8a8c72ac345403e91362d091db48a700a3d1a6c3|SOEHWGF12A6D4F8B2B|1         |Hips Don't Lie (featuring Wyclef Jean)|Shakira Featuring Wyclef Jean|8679        |253         |
+|e5831bac6afc67cd5241fdd9997f91ddcdd10c8f|SOEHWGF12A6D4F8B2B|2         |Hips Don't Lie (featuring Wyclef Jean)|Shakira Featuring Wyclef Jean|14459       |253         |
+|9655d1fb5c212be843a4e13505add9c4c8d0e648|SOEHWGF12A6D4F8B2B|2         |Hips Don't Lie (featuring Wyclef Jean)|Shakira Featuring Wyclef Jean|9425        |253         |
++----------------------------------------+------------------+----------+--------------------------------------+-----------------------------+------------+------------+
+only showing top 10 rows
+
+
+
+
+ +
+
+ +
+
+
+
In [0]:
+
+
+
# indexer = [StringIndexer(inputCol=column, outputCol=column+"_index") for column in list(set(df.columns)-set(['overall'])) ]
+# pipeline = Pipeline(stages=indexer)
+# transformed = pipeline.fit(df).transform(df)
+# transformed.show(truncate=False)
+
+ +
+
+
+ +
+
+
+
In [0]:
+
+
+
# user = list(transformed.select('user_id_index').distinct().sort(transformed["user_id_index"])) # Get our unique customers
+# song = list(transformed.select('song_ids_index').distinct().sort(transformed["song_ids_index"])) # Get our unique products that were purchased
+# playCount = list(transformed.select('play_count')) # All of our purchases
+
+# # rows = transformed.select('user_id_index').astype('category', categories = user).cat.codes 
+# # # Get the associated row indices
+# # cols = transformed.song_ids_index.astype('category', categories = song).cat.codes 
+# # Get the associated column indices
+# # playCount_sparse = sparse.csr_matrix((playCount, (user, song)), shape=(len(user), len(song)))
+
+ +
+
+
+ +
+
+
+
In [0]:
+
+
+
(training,test)=df.randomSplit([0.8, 0.2])
+
+ +
+
+
+ +
+
+
+
In [0]:
+
+
+
als=ALS(maxIter=5, regParam=0.09,rank=25,userCol="user_id_code",itemCol="song_id_code",ratingCol="play_count",coldStartStrategy="drop",nonnegative=True)
+model=als.fit(training)
+
+ +
+
+
+ +
+
+
+
In [30]:
+
+
+
evaluator=RegressionEvaluator(metricName="rmse",labelCol="play_count",predictionCol="prediction")
+predictions=model.transform(test)
+predictions.show(50, truncate = False)
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
+----------------------------------------+------------------+----------+----------------------------------------+----------------------------------------------+------------+------------+----------+
+|user_id                                 |song_ids          |play_count|song_titles                             |artist_names                                  |user_id_code|song_id_code|prediction|
++----------------------------------------+------------------+----------+----------------------------------------+----------------------------------------------+------------+------------+----------+
+|e9540efbbef64e43274b9243242a6b7805d9ea23|SOQHTUT12A8AE475F2|1         |Let It Go                               |Kirk Franklin with tobyMac & Sonny (of P.O.D.)|14669       |833         |0.45323807|
+|50b6af13a2dab6f62d6fcb40857e6858cb1d277a|SOQHTUT12A8AE475F2|1         |Let It Go                               |Kirk Franklin with tobyMac & Sonny (of P.O.D.)|5026        |833         |0.14361864|
+|6b7325774444b6833a431c6568ecc1a1dc13137e|SOHCYND12AF72A3CD9|2         |Deliverance                             |Sick Puppies                                  |6718        |392         |0.18159722|
+|5676285d65ae3916cffc7306e4cdd57e87a19564|SOHCYND12AF72A3CD9|2         |Deliverance                             |Sick Puppies                                  |5400        |392         |0.12738255|
+|13107c1047c7aa78b77abdd569c5a8a2d0656f4b|SOHCYND12AF72A3CD9|1         |Deliverance                             |Sick Puppies                                  |1213        |392         |0.3783775 |
+|f730ace25b605210df87b2f8f7e786098f2e9bdc|SOHCYND12AF72A3CD9|1         |Deliverance                             |Sick Puppies                                  |15522       |392         |0.09791306|
+|db4a617f8b2591dd9c9fb4fc3cacc6fc4664301e|SORNVVT12AF72A0C39|1         |Intro 2/ Kick Out The Jams (LP Version) |MC5                                           |13831       |897         |4.464061  |
+|7570c8d981604a55303eabae535d4893c9d88ed3|SOWGZFG12A8151AF41|3         |Monsoon                                 |Jack Johnson                                  |7365        |1139        |0.6967279 |
+|c79757a61275da9490f190ce26839bce70051223|SOWGZFG12A8151AF41|1         |Monsoon                                 |Jack Johnson                                  |12636       |1139        |0.43220574|
+|aa8e076a5bb5d588640cb44475538115dd00e734|SOBCKIM12A8C13936C|2         |Pero Me Acuerdo De Tí                   |Christina Aguilera                            |10739       |65          |0.20451252|
+|66b888018aaa0c9650e57695a7a280b5c8439cde|SOBCKIM12A8C13936C|2         |Pero Me Acuerdo De Tí                   |Christina Aguilera                            |6384        |65          |0.20208909|
+|9fcad0a2a2e70d2b5c08d636c1f832a6cd1787c5|SOBCKIM12A8C13936C|5         |Pero Me Acuerdo De Tí                   |Christina Aguilera                            |10044       |65          |0.24047722|
+|cc08a89168e4626e96c4add2741428cc6bb9580f|SOBCKIM12A8C13936C|1         |Pero Me Acuerdo De Tí                   |Christina Aguilera                            |12898       |65          |0.46032727|
+|866852a40ef28805eb08345db0ea5f83298dff33|SOPOPLW12A8C13A905|2         |Umbrella                                |All Time Low                                  |8438        |804         |0.7917186 |
+|77e9be7a7aeb763c7281f175af5b0f8e137ef05e|SOWQTQZ12A58A7B63E|6         |Streets On Fire (Explicit Album Version)|Lupe Fiasco                                   |7530        |1157        |3.3458128 |
+|feb4add07933d0513582357eb37acfaffdd6c1ed|SOWQTQZ12A58A7B63E|13        |Streets On Fire (Explicit Album Version)|Lupe Fiasco                                   |16002       |1157        |7.806897  |
+|03b5cdbea481827ebe9be7e1834f3926039478fd|SOWQTQZ12A58A7B63E|2         |Streets On Fire (Explicit Album Version)|Lupe Fiasco                                   |246         |1157        |0.55763555|
+|8f8718a02b26e245271e4c97cd1bd879d3a906ab|SOWQTQZ12A58A7B63E|1         |Streets On Fire (Explicit Album Version)|Lupe Fiasco                                   |8975        |1157        |0.7940686 |
+|8caa525aa6d5e4b3ca496ef66474cb13b940d167|SOWQTQZ12A58A7B63E|1         |Streets On Fire (Explicit Album Version)|Lupe Fiasco                                   |8802        |1157        |1.1152711 |
+|a8d16acb9faa12319d1f02c608e152499a49bbc4|SOWQTQZ12A58A7B63E|1         |Streets On Fire (Explicit Album Version)|Lupe Fiasco                                   |10616       |1157        |1.2735506 |
+|ba52d1f72421e85d8ec9a7710fa241701789e95d|SOWQTQZ12A58A7B63E|1         |Streets On Fire (Explicit Album Version)|Lupe Fiasco                                   |11797       |1157        |0.7973523 |
+|fbb95b3033414a8c1eca2f84e2a2a06c566b5419|SOQMWJG12A6701E1AC|1         |Mistadobalina                           |Del Tha Funkee Homosapien                     |15815       |853         |0.32017633|
+|810763837886194a5a29369fbf90e2c94c69f8ec|SOBJUKG12A58A7DCA8|3         |Two Hearts                              |Phil Collins                                  |8082        |78          |2.3471355 |
+|7f6b98f36f7d8ab61bc7369ba7e852dc68cff13d|SOBJUKG12A58A7DCA8|1         |Two Hearts                              |Phil Collins                                  |7985        |78          |2.5378666 |
+|3df157f6460ccd6c5d2e7668f346b3aacec3cee0|SOSYKKS12A8C1388DF|3         |I've Been Missin' You                   |Kenny G                                       |3859        |961         |1.7619411 |
+|aeb1c5c11b789ff1a539df055ef98d3e74ba9c15|SOSYKKS12A8C1388DF|1         |I've Been Missin' You                   |Kenny G                                       |10998       |961         |0.06636223|
+|79bc03969de1477795a38424217ce64b3c6fea8a|SOGRXZY12A8C139043|2         |Thrill Me                               |Simply Red                                    |7635        |375         |3.0921402 |
+|0dfda19a8fe30d8d73dc7877b71274b5288ec4c4|SOSQIHH12A8C13370B|6         |15 Step                                 |Radiohead                                     |898         |950         |0.50227386|
+|8aeeb65f0268b7a05000e6d3134ce90556a5bc59|SOSQIHH12A8C13370B|1         |15 Step                                 |Radiohead                                     |8701        |950         |0.17800006|
+|5b88f92853699ce0e2f01c94811e9b4b738bbc56|SOSQIHH12A8C13370B|5         |15 Step                                 |Radiohead                                     |5708        |950         |0.12803972|
+|a4f7814a2d41fe3ee56d4d9ec61065c0eb4e34c2|SOSQIHH12A8C13370B|5         |15 Step                                 |Radiohead                                     |10376       |950         |0.40219158|
+|b2084be1b2af9e87342c4f50afc38aa60262e143|SOSQIHH12A8C13370B|1         |15 Step                                 |Radiohead                                     |11211       |950         |0.2892505 |
+|00a36168ed80334a6816e1feefd5b40aba212e31|SOSQIHH12A8C13370B|1         |15 Step                                 |Radiohead                                     |39          |950         |0.76593107|
+|67156d29151420f8dc1a07c4ffb0503cd68e6af2|SOSQIHH12A8C13370B|1         |15 Step                                 |Radiohead                                     |6408        |950         |0.39203826|
+|d68df3e077f0f7186a253b9d7fbc46bbab9729c7|SOSQIHH12A8C13370B|1         |15 Step                                 |Radiohead                                     |13550       |950         |0.21767785|
+|a27b290959968b0a68fc0413c68168abc42862cb|SOSQIHH12A8C13370B|6         |15 Step                                 |Radiohead                                     |10226       |950         |0.26897588|
+|9a25d037f6baa53e68718ad5a1efa29eee5f616b|SOSQIHH12A8C13370B|2         |15 Step                                 |Radiohead                                     |9681        |950         |1.088389  |
+|4754b7dd2044458b395bc48e0234ac15e6866db9|SOSQIHH12A8C13370B|1         |15 Step                                 |Radiohead                                     |4479        |950         |0.37529486|
+|ed4cc725685df08ccf7b91c41849593c635cf472|SOSQIHH12A8C13370B|1         |15 Step                                 |Radiohead                                     |14894       |950         |0.18009022|
+|bc18fe85c530d64b1f3f3ec379d99101ca514335|SOSQIHH12A8C13370B|1         |15 Step                                 |Radiohead                                     |11926       |950         |1.0580803 |
+|6fc14b3e06c448a9d5d7a62c3690e7f6a82ac5a7|SOCGOZK12A8151BD5D|1         |Fake Tales Of San Francisco             |Arctic Monkeys                                |6997        |126         |0.5295702 |
+|67b96f36e135b5f8bb2b225df02b3ab3b60a53c1|SOCGOZK12A8151BD5D|1         |Fake Tales Of San Francisco             |Arctic Monkeys                                |6453        |126         |1.1715788 |
+|4c82312f9bbcc5959d3488629f84f13511942f81|SOCGOZK12A8151BD5D|2         |Fake Tales Of San Francisco             |Arctic Monkeys                                |4769        |126         |0.25347772|
+|81ed9ee674cc9629c312241d63385b070459077e|SOCGOZK12A8151BD5D|1         |Fake Tales Of San Francisco             |Arctic Monkeys                                |8148        |126         |0.65165347|
+|c09b819115c01fe81a1a05be3dc4e584d204c662|SOCGOZK12A8151BD5D|2         |Fake Tales Of San Francisco             |Arctic Monkeys                                |12188       |126         |2.1347234 |
+|7d3132b7aa8341f5d7515fb59e38f03d7f068082|SOOGKOY12B34F33114|5         |Refuge                                  |Matisyahu                                     |7847        |756         |0.6455815 |
+|fbcf8182103b622c489933422f64e9b57e10c020|SOOGKOY12B34F33114|2         |Refuge                                  |Matisyahu                                     |15822       |756         |1.5800511 |
+|05cc826cf9112e83d84f1cecd44fc0e527b047fd|SOQLNEY12B0B8062FA|2         |Dancing Shoes                           |Arctic Monkeys                                |368         |847         |0.70986754|
+|47f2b4e16751254b0c0545328e77c5e4d249c1ce|SOQLNEY12B0B8062FA|9         |Dancing Shoes                           |Arctic Monkeys                                |4521        |847         |0.48080844|
+|b154143628bfdc0efc14e0229cad21a18a9cf4ad|SOQLNEY12B0B8062FA|1         |Dancing Shoes                           |Arctic Monkeys                                |11168       |847         |0.48080844|
++----------------------------------------+------------------+----------+----------------------------------------+----------------------------------------------+------------+------------+----------+
+only showing top 50 rows
+
+
+
+
+ +
+
+ +
+
+
+
In [0]:
+
+
+
rmse = evaluator.evaluate(predictions)
+
+ +
+
+
+ +
+
+
+
In [44]:
+
+
+
print("Root-mean-square error = " + str(rmse))
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
Root-mean-square error = 5.517126413712533
+
+
+
+ +
+
+ +
+
+
+
In [0]:
+
+
+
# user_recs=model.recommendForAllUsers(10).show(10, truncate = False)
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
+-------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+|user_id_index|recommendations                                                                                                                                                                                              |
++-------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+|148          |[[132559, 128.63263], [147680, 83.976524], [66419, 82.88117], [125845, 76.72285], [82226, 76.19292], [39411, 76.14007], [162509, 75.64509], [99909, 63.91176], [98323, 63.563046], [117480, 62.751663]]      |
+|463          |[[50694, 81.836334], [39411, 64.48308], [147680, 64.23534], [122151, 61.286102], [91642, 56.230762], [18266, 45.621635], [132559, 45.549026], [162509, 43.640633], [125845, 39.744972], [28504, 38.03746]]   |
+|471          |[[91642, 166.9629], [90521, 82.83951], [118079, 81.80899], [90425, 70.81573], [28504, 69.14364], [125845, 65.72644], [130593, 63.165348], [147680, 60.90121], [123867, 60.728004], [116217, 54.02317]]       |
+|496          |[[98323, 561.9435], [159673, 237.96635], [29924, 204.07669], [130289, 202.01738], [162509, 188.40092], [64530, 180.07327], [96723, 176.96783], [47412, 176.5399], [117683, 176.40698], [94070, 173.90211]]   |
+|833          |[[125845, 261.29282], [162509, 211.07877], [91642, 209.26482], [90521, 200.1382], [39411, 183.05717], [132559, 174.52623], [50694, 170.21997], [147680, 165.52065], [82226, 135.1852], [93177, 130.17105]]   |
+|1088         |[[91642, 477.74738], [132559, 301.17938], [98323, 163.98624], [123867, 163.49843], [130593, 150.79263], [147680, 148.13669], [28504, 145.4549], [90521, 139.62958], [162509, 136.77386], [122151, 136.32388]]|
+|1238         |[[18266, 157.90025], [91642, 144.36684], [50694, 119.0692], [122151, 78.154465], [11315, 73.731895], [62883, 68.069824], [36371, 66.961914], [154520, 66.59154], [9336, 64.87565], [63740, 64.10445]]        |
+|1342         |[[132559, 215.22742], [32380, 146.98671], [123867, 143.82867], [40945, 137.36111], [117480, 121.496414], [36371, 117.13508], [91642, 107.41648], [21660, 107.31862], [98323, 104.51557], [46713, 104.25622]] |
+|1580         |[[132559, 347.78375], [98323, 195.82375], [159673, 132.96431], [51399, 103.85994], [64530, 102.61894], [162509, 90.60711], [90425, 89.49118], [23038, 87.83676], [36371, 78.12712], [36489, 73.4358]]        |
+|1591         |[[50694, 125.0975], [122151, 99.453705], [88869, 85.341286], [132559, 70.60342], [91642, 66.271194], [80202, 65.54762], [147680, 63.61119], [162509, 47.968006], [66419, 47.93394], [47290, 46.066273]]      |
++-------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+only showing top 10 rows
+
+
+
+
+ +
+
+ +
+
+
+
In [0]:
+
+
+
recs=model.recommendForAllUsers(10).toPandas()
+
+ +
+
+
+ +
+
+
+
In [32]:
+
+
+
recs
+
+ +
+
+
+ +
+
+ + +
+ +
Out[32]:
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
user_id_coderecommendations
01580[(226, 12.034584999084473), (990, 7.5423817634...
14900[(226, 12.202627182006836), (339, 3.8053884506...
26620[(226, 93.89700317382812), (643, 57.0851860046...
37340[(704, 114.73605346679688), (226, 99.090141296...
47880[(226, 47.703304290771484), (704, 34.140014648...
.........
131346438[(226, 40.68645477294922), (792, 13.7023382186...
1313515908[(226, 11.6093168258667), (120, 6.681258678436...
1313689[(226, 4.944281578063965), (979, 2.78582954406...
131377999[(226, 67.30372619628906), (990, 64.1438751220...
1313814879[(226, 9.831428527832031), (704, 4.22424602508...
+

13139 rows × 2 columns

+
+
+ +
+ +
+
+ +
+
+
+
In [33]:
+
+
+
recs.shape
+
+ +
+
+
+ +
+
+ + +
+ +
Out[33]:
+ + + + +
+
(13139, 2)
+
+ +
+ +
+
+ +
+
+
+
In [0]:
+
+
+
song_df = pd.read_csv('/content/gdrive/My Drive/MscsDs/MillionSongSubset/msd.csv')
+
+ +
+
+
+ +
+
+
+
In [35]:
+
+
+
song_df.head()
+
+ +
+
+
+ +
+
+ + +
+ +
Out[35]:
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Unnamed: 0Unnamed: 0.1song_idssong_titlessong_durationssong_realease_yearsartist_namessong_hotnesssong_temposong_energiessong_danceabilitysong_barssong_beatssong_time_signaturessong_tatumsong_modessong_keysartist_familiartyartist_hotness
000SONHTWP12A8C142744Vals '89162.585670Manolis Famellos & I PodilatesNaN94.3010.00.0[ 1.45502 3.39383 5.32826 7.25953 9.1...[ 0.16441 0.80395 1.45502 2.09102 2.7...3[ 0.16441 0.48418 0.80395 1.13522 1.4...100.2287300.000000
111SOPIHMB12AC468E0DDGhost of the Ocean (Live)214.255870Uriah Heep0.2502149.9210.00.0[ 1.20218 2.80457 4.39266 5.98514 7.5...[ 0.38752 0.79653 1.20218 1.60244 2.0...4[ 0.2523 0.38752 0.52273 ... 212.97102 2...170.6732390.479205
222SODRPJT12AC468DEF1The frog song169.873830Alain-FrançoisNaN136.0440.00.0[ 1.37397 4.48312 7.56804 10.65675 13.7...[ 0.48609 0.93058 1.37397 1.81958 2.2...7[ 0.26328 0.48609 0.70778 0.93058 1.1...120.3803170.300918
333SOLLOTO12AB01804C6Deep Blue Sea (Daniel Rossen home recording)351.503222008Grizzly BearNaN85.0030.00.0[ 0.72449 3.55798 6.37712 9.20176 12.0...[ 0.72449 1.43405 2.1445 2.85228 3.5...4[1.8653000e-01 3.6881000e-01 5.4665000e-01 ......190.7606360.547244
444SOCNYGS12AB01832B8La vérité252.446892007Annie Blanchard0.0000113.2870.00.0[2.2334000e-01 2.3324800e+00 4.4484000e+00 6.5...[2.2334000e-01 7.5000000e-01 1.2775800e+00 1.8...4[2.2334000e-01 3.9890000e-01 5.7445000e-01 ......150.4797350.352460
+
+
+ +
+ +
+
+ +
+
+
+
In [41]:
+
+
+
count = 0
+song_id_found = set()
+for recValue in recs.values:
+    for item in recValue[1]:
+      row = frame.loc[frame['song_id_code'] == item.song_id_code]
+      song_id = row.song_ids.values[0]
+      if ( song_id not in song_id_found) and (song_df.loc[ song_df['song_ids'] == song_id].shape[0] == 1):
+        rowDetails = song_df.loc[ song_df['song_ids'] == song_id]
+        print(" Recommendation to user ", recValue[0], " : ")
+        print("   Song: ", rowDetails.song_titles.values[0])  
+        print("   Artist: ",  rowDetails.artist_names.values[0])
+        song_id_found.add(song_id)
+        count += 20
+        
+    if count > 20:
+      break
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
 Recommendation to user  1580  : 
+   Song:  Till There Was You (John Creamer & Stephane K Remix)
+   Artist:  Rachael Starr
+ Recommendation to user  1580  : 
+   Song:  Are You There (With Another Girl)
+   Artist:  Burt Bacharach
+ Recommendation to user  1580  : 
+   Song:  The Dynamo Of Volition [From An All Night Session]
+   Artist:  Jason Mraz
+ Recommendation to user  1580  : 
+   Song:  La mujer que no sone (Album)
+   Artist:  Ricardo Arjona
+ Recommendation to user  1580  : 
+   Song:  Mas P**' (America'S Mexican)
+   Artist:  George Lopez
+ Recommendation to user  1580  : 
+   Song:  Love Ain't No Stranger (2003 Digital Remaster)
+   Artist:  Whitesnake
+ Recommendation to user  1580  : 
+   Song:  Illuminate
+   Artist:  Orbital
+ Recommendation to user  1580  : 
+   Song:  Song From Moulin Rouge
+   Artist:  Percy Faith & His Orchestra
+ Recommendation to user  1580  : 
+   Song:  Camino
+   Artist:  Gipsy Kings
+ Recommendation to user  1580  : 
+   Song:  Set The World On Fire
+   Artist:  Britt Nicole
+
+
+
+ +
+
+ +
+
+
+
In [42]:
+
+
+
print(" Recommendation to user 148 : ")
+for recom in recs.query('user_id_code == 148').recommendations:
+  for item in recom:
+    row = frame.loc[frame['song_id_code'] == item.song_id_code]
+    print("\n   Song ID: ", row.song_ids.values[0])
+    song_id = row.song_ids.values[0]
+    if song_df.loc[ song_df['song_ids'] == song_id].shape[0] == 1:
+      rowDetails = song_df.loc[ song_df['song_ids'] == song_id]
+      print("     Song: ", rowDetails.song_titles.values[0])  
+      print("     Artist: ",  rowDetails.artist_names.values[0])
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
 Recommendation to user 148 : 
+
+   Song ID:  SODUSRP12A6D4FA762
+     Song:  Till There Was You (John Creamer & Stephane K Remix)
+     Artist:  Rachael Starr
+
+   Song ID:  SONCQTI12A8AE477B2
+     Song:  Mas P**' (America'S Mexican)
+     Artist:  George Lopez
+
+   Song ID:  SOPHJIS12AC3DF5FA3
+     Song:  La mujer que no sone (Album)
+     Artist:  Ricardo Arjona
+
+   Song ID:  SOCDAIR12A8C131F89
+     Song:  The Dynamo Of Volition [From An All Night Session]
+     Artist:  Jason Mraz
+
+   Song ID:  SOTMGME12AB017F79B
+     Song:  Are You There (With Another Girl)
+     Artist:  Burt Bacharach
+
+   Song ID:  SOLTZTZ12A58A7A84F
+     Song:  Best Friends
+     Artist:  Kieran
+
+   Song ID:  SOOBUUM12A8C13696A
+     Song:  Telling Me Lies
+     Artist:  Dolores Keane
+
+   Song ID:  SOGLETQ12AB0186E93
+     Song:  Pose No Threat
+     Artist:  Lunasicc
+
+   Song ID:  SOGEQKA12A6D4FA27C
+     Song:  Love Ain't No Stranger (2003 Digital Remaster)
+     Artist:  Whitesnake
+
+   Song ID:  SOITOFS12A81C21D00
+     Song:  Camino
+     Artist:  Gipsy Kings
+
+
+
+ +
+
+ +
+
+
+
In [45]:
+
+
+
print(" Recommendation to user 6438 : ")
+for recom in recs.query('user_id_code == 6438').recommendations:
+  for item in recom:
+    row = frame.loc[frame['song_id_code'] == item.song_id_code]
+    print("\n   Song ID: ", row.song_ids.values[0])
+    song_id = row.song_ids.values[0]
+    if song_df.loc[ song_df['song_ids'] == song_id].shape[0] == 1:
+      rowDetails = song_df.loc[ song_df['song_ids'] == song_id]
+      print("     Song: ", rowDetails.song_titles.values[0])  
+      print("     Artist: ",  rowDetails.artist_names.values[0])
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
 Recommendation to user 6438 : 
+
+   Song ID:  SODUSRP12A6D4FA762
+     Song:  Till There Was You (John Creamer & Stephane K Remix)
+     Artist:  Rachael Starr
+
+   Song ID:  SOPHJIS12AC3DF5FA3
+     Song:  La mujer que no sone (Album)
+     Artist:  Ricardo Arjona
+
+   Song ID:  SOGLETQ12AB0186E93
+     Song:  Pose No Threat
+     Artist:  Lunasicc
+
+   Song ID:  SOVFRDB12AB017FF3A
+     Song:  Got It Twisted
+     Artist:  Mobb Deep
+
+   Song ID:  SOTHZUA12A8C13268A
+     Song:  All I Ask For (Album Version)
+     Artist:  Ill Nino
+
+   Song ID:  SOZAQVA12AB0183627
+     Song:  Eight More Miles To Louisville
+     Artist:  Jim Kweskin
+
+   Song ID:  SOITOFS12A81C21D00
+     Song:  Camino
+     Artist:  Gipsy Kings
+
+   Song ID:  SONCQTI12A8AE477B2
+     Song:  Mas P**' (America'S Mexican)
+     Artist:  George Lopez
+
+   Song ID:  SOVMKKT12A58A7F0CC
+     Song:  Love Unlimited (Explicit)
+     Artist:  Fun Lovin' Criminals
+
+   Song ID:  SOCDAIR12A8C131F89
+     Song:  The Dynamo Of Volition [From An All Night Session]
+     Artist:  Jason Mraz
+
+
+
+ +
+
+ +
+
+
+
In [0]:
+
+
+
rec_item = model.recommendForAllItems(10).toPandas()
+
+ +
+
+
+ +
+
+
+
In [46]:
+
+
+
rec_item
+
+ +
+
+
+ +
+
+ + +
+ +
Out[46]:
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
song_id_coderecommendations
0471[(6241, 18.191701889038086), (424, 14.06768226...
1463[(424, 17.405658721923828), (1907, 15.71860694...
2833[(12902, 39.05113220214844), (117, 29.65908813...
3496[(6241, 13.5421142578125), (6223, 12.761930465...
4148[(6241, 227.50213623046875), (13241, 131.88528...
.........
1204401[(6241, 36.72122573852539), (424, 23.037067413...
1205422[(6241, 21.395238876342773), (424, 19.07993888...
1206517[(12902, 30.867374420166016), (117, 23.4435768...
12071138[(12902, 35.97333908081055), (424, 33.69433212...
120889[(6241, 26.182523727416992), (13241, 15.178276...
+

1209 rows × 2 columns

+
+
+ +
+ +
+
+ +
+
+
+
In [0]:
+
+
+
# print(" Recommendation for 1138 : ")
+# for recom in rec_item.query('song_id_code == 1138').recommendations:
+#   for item in recom:
+#     row = frame.loc[frame['user_id_code'] == item.user_id_code]
+#     print("\n   user_id ID: ", row.user_id.values[0])
+#     user_id = row.user_id.values[0]
+#     if frame.loc[ frame['user_id'] == user_id].shape[0] > 0:
+#       rowDetails = frame.loc[ frame['user_id'] == song_id]
+#       print(rowDetails.values)
+#       print("     Song: ", rowDetails.song_titles.values[0])  
+#       print("     Artist: ",  rowDetails.artist_names.values[0])
+
+ +
+
+
+ +
+
+
+ + + + + + diff --git a/Subset_Spark_ALS.ipynb b/Subset_Spark_ALS.ipynb new file mode 100644 index 0000000..bfad8f9 --- /dev/null +++ b/Subset_Spark_ALS.ipynb @@ -0,0 +1,2056 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "kvD4HBMi0ohY" + }, + "source": [ + "# Install Java, Spark, and Findspark\n", + "This installs Apache Spark 2.3.2, Java 8, and [Findspark](https://github.com/minrk/findspark), a library that makes it easy for Python to find Spark." + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "fUhBhrGmyAvs" + }, + "outputs": [], + "source": [ + "!apt-get install openjdk-8-jdk-headless -qq > /dev/null\n", + "!wget -q http://www-eu.apache.org/dist/spark/spark-2.4.4/spark-2.4.4-bin-hadoop2.7.tgz\n", + "!tar xf spark-2.4.4-bin-hadoop2.7.tgz\n", + "!pip install -q findspark" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 394 + }, + "colab_type": "code", + "id": "5hhXcL2PLMGu", + "outputId": "8af1d1cf-829f-44e6-f837-34f7be8190d1" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Collecting py4j\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/04/de/2d314a921ef4c20b283e1de94e0780273678caac901564df06b948e4ba9b/py4j-0.10.8.1-py2.py3-none-any.whl (196kB)\n", + "\r", + "\u001b[K |█▊ | 10kB 23.5MB/s eta 0:00:01\r", + "\u001b[K |███▍ | 20kB 27.1MB/s eta 0:00:01\r", + "\u001b[K |█████ | 30kB 32.2MB/s eta 0:00:01\r", + "\u001b[K |██████▊ | 40kB 35.9MB/s eta 0:00:01\r", + "\u001b[K |████████▍ | 51kB 37.5MB/s eta 0:00:01\r", + "\u001b[K |██████████ | 61kB 38.9MB/s eta 0:00:01\r", + "\u001b[K |███████████▊ | 71kB 39.7MB/s eta 0:00:01\r", + "\u001b[K |█████████████▍ | 81kB 40.6MB/s eta 0:00:01\r", + "\u001b[K |███████████████ | 92kB 41.9MB/s eta 0:00:01\r", + "\u001b[K |████████████████▊ | 102kB 43.3MB/s eta 0:00:01\r", + "\u001b[K |██████████████████▍ | 112kB 43.3MB/s eta 0:00:01\r", + "\u001b[K |████████████████████ | 122kB 43.3MB/s eta 0:00:01\r", + "\u001b[K |█████████████████████▊ | 133kB 43.3MB/s eta 0:00:01\r", + "\u001b[K |███████████████████████▍ | 143kB 43.3MB/s eta 0:00:01\r", + "\u001b[K |█████████████████████████ | 153kB 43.3MB/s eta 0:00:01\r", + "\u001b[K |██████████████████████████▊ | 163kB 43.3MB/s eta 0:00:01\r", + "\u001b[K |████████████████████████████▍ | 174kB 43.3MB/s eta 0:00:01\r", + "\u001b[K |██████████████████████████████ | 184kB 43.3MB/s eta 0:00:01\r", + "\u001b[K |███████████████████████████████▊| 194kB 43.3MB/s eta 0:00:01\r", + "\u001b[K |████████████████████████████████| 204kB 43.3MB/s \n", + "\u001b[?25hInstalling collected packages: py4j\n", + "Successfully installed py4j-0.10.8.1\n", + "Collecting pyspark\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/87/21/f05c186f4ddb01d15d0ddc36ef4b7e3cedbeb6412274a41f26b55a650ee5/pyspark-2.4.4.tar.gz (215.7MB)\n", + "\u001b[K |████████████████████████████████| 215.7MB 64kB/s \n", + "\u001b[?25hCollecting py4j==0.10.7\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/e3/53/c737818eb9a7dc32a7cd4f1396e787bd94200c3997c72c1dbe028587bd76/py4j-0.10.7-py2.py3-none-any.whl (197kB)\n", + "\u001b[K |████████████████████████████████| 204kB 55.2MB/s \n", + "\u001b[?25hBuilding wheels for collected packages: pyspark\n", + " Building wheel for pyspark (setup.py) ... \u001b[?25l\u001b[?25hdone\n", + " Created wheel for pyspark: filename=pyspark-2.4.4-py2.py3-none-any.whl size=216130387 sha256=53fa43efd68d50f78561f4969da5668de7ac38fc64910ef99f251a9199228e49\n", + " Stored in directory: /root/.cache/pip/wheels/ab/09/4d/0d184230058e654eb1b04467dbc1292f00eaa186544604b471\n", + "Successfully built pyspark\n", + "Installing collected packages: py4j, pyspark\n", + " Found existing installation: py4j 0.10.8.1\n", + " Uninstalling py4j-0.10.8.1:\n", + " Successfully uninstalled py4j-0.10.8.1\n", + "Successfully installed py4j-0.10.7 pyspark-2.4.4\n" + ] + } + ], + "source": [ + "!pip install py4j\n", + "!pip install pyspark" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "b4Kjvk_h1AHl" + }, + "source": [ + "# Set Environment Variables\n", + "Set the locations where Spark and Java are installed." + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "8Xnb_ePUyQIL" + }, + "outputs": [], + "source": [ + "import os\n", + "os.environ[\"JAVA_HOME\"] = \"/usr/lib/jvm/java-8-openjdk-amd64\"\n", + "os.environ[\"SPARK_HOME\"] = \"/content/spark-2.4.4-bin-hadoop2.7\"" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "NwU28K5f1H3P" + }, + "source": [ + "# Start a SparkSession\n", + "This will start a local Spark session." + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "lsMpgjgaAbuI" + }, + "outputs": [], + "source": [ + "import os\n", + "import time" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "b3xI5hrK_p4l" + }, + "outputs": [], + "source": [ + "# spark imports\n", + "from pyspark.sql import SparkSession\n", + "from pyspark.sql.functions import UserDefinedFunction, explode, desc\n", + "from pyspark.sql.types import StringType, ArrayType\n", + "from pyspark.mllib.recommendation import ALS" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "q-m8p5V9AeSp" + }, + "outputs": [], + "source": [ + "# data science imports\n", + "import math\n", + "import numpy as np\n", + "import pandas as pd\n", + "\n", + "# visualization imports\n", + "import seaborn as sns\n", + "import matplotlib.pyplot as plt\n", + "\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "zgReRGl0y23D" + }, + "outputs": [], + "source": [ + "import findspark\n", + "findspark.init(\"spark-2.4.4-bin-hadoop2.7\")# SPARK_HOME\n", + "\n", + "from pyspark.sql import SparkSession\n", + "spark = SparkSession.builder.master(\"local[*]\").getOrCreate()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 122 + }, + "colab_type": "code", + "id": "7kI3tH14nyTG", + "outputId": "27c9fccd-6925-424e-8699-0fba2b896970" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Go to this URL in a browser: https://accounts.google.com/o/oauth2/auth?client_id=947318989803-6bn6qk8qdgf4n4g3pfee6491hc0brc4i.apps.googleusercontent.com&redirect_uri=urn%3aietf%3awg%3aoauth%3a2.0%3aoob&response_type=code&scope=email%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdocs.test%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdrive%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdrive.photos.readonly%20https%3a%2f%2fwww.googleapis.com%2fauth%2fpeopleapi.readonly\n", + "\n", + "Enter your authorization code:\n", + "··········\n", + "Mounted at /content/gdrive\n" + ] + } + ], + "source": [ + "from google.colab import drive\n", + "drive.mount('/content/gdrive')" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "PacPhfuan_6r" + }, + "outputs": [], + "source": [ + "!cp /content/gdrive/My\\ Drive/MscsDs/msdchallenge/kaggle_visible_evaluation_triplets.txt ." + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "3q9GWx_2oFLS" + }, + "outputs": [], + "source": [ + "!cp -r /content/gdrive/My\\ Drive/MscsDs/MSongsDB-master/PythonSrc ." + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "pyiYETN8oQbG" + }, + "outputs": [], + "source": [ + "# ! cd /content/gdrive/My\\ Drive/MscsDs/ && tar -zxvf millionsongsubset_full.tar.gz" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 204 + }, + "colab_type": "code", + "id": "MDD5vViroUvk", + "outputId": "22e8a9e7-3bf7-4294-90cf-d5bfb7708cd0" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
user_idsong_idsplay_count
0fd50c4007b68a3737fe052d5a4f78ce8aa117f3dSOBONKR12A58A7A7E01
1fd50c4007b68a3737fe052d5a4f78ce8aa117f3dSOEGIYH12A6D4FC0E31
2fd50c4007b68a3737fe052d5a4f78ce8aa117f3dSOFLJQZ12A6D4FADA61
3fd50c4007b68a3737fe052d5a4f78ce8aa117f3dSOHTKMO12AB01843B01
4fd50c4007b68a3737fe052d5a4f78ce8aa117f3dSODQZCY12A6D4F9D111
\n", + "
" + ], + "text/plain": [ + " user_id song_ids play_count\n", + "0 fd50c4007b68a3737fe052d5a4f78ce8aa117f3d SOBONKR12A58A7A7E0 1\n", + "1 fd50c4007b68a3737fe052d5a4f78ce8aa117f3d SOEGIYH12A6D4FC0E3 1\n", + "2 fd50c4007b68a3737fe052d5a4f78ce8aa117f3d SOFLJQZ12A6D4FADA6 1\n", + "3 fd50c4007b68a3737fe052d5a4f78ce8aa117f3d SOHTKMO12AB01843B0 1\n", + "4 fd50c4007b68a3737fe052d5a4f78ce8aa117f3d SODQZCY12A6D4F9D11 1" + ] + }, + "execution_count": 11, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "users = pd.read_table('./kaggle_visible_evaluation_triplets.txt', sep='\\t', names= ['user_id','song_ids','play_count'])\n", + "users.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 204 + }, + "colab_type": "code", + "id": "poCqPDzGFa14", + "outputId": "a9fc644e-ee83-46af-ca14-43981a650966" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
song_idssong_titlesartist_names
0SONHTWP12A8C142744Vals '89Manolis Famellos & I Podilates
1SOPIHMB12AC468E0DDGhost of the Ocean (Live)Uriah Heep
2SODRPJT12AC468DEF1The frog songAlain-François
3SOLLOTO12AB01804C6Deep Blue Sea (Daniel Rossen home recording)Grizzly Bear
4SOCNYGS12AB01832B8La véritéAnnie Blanchard
\n", + "
" + ], + "text/plain": [ + " song_ids ... artist_names\n", + "0 SONHTWP12A8C142744 ... Manolis Famellos & I Podilates\n", + "1 SOPIHMB12AC468E0DD ... Uriah Heep\n", + "2 SODRPJT12AC468DEF1 ... Alain-François\n", + "3 SOLLOTO12AB01804C6 ... Grizzly Bear\n", + "4 SOCNYGS12AB01832B8 ... Annie Blanchard\n", + "\n", + "[5 rows x 3 columns]" + ] + }, + "execution_count": 17, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "nd = pd.read_csv('/content/gdrive/My Drive/MscsDs/MillionSongSubset/msd.csv')\n", + "nd=nd[['song_ids','song_titles','artist_names']]\n", + "nd.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "hwFRfTFypgyK" + }, + "outputs": [], + "source": [ + "from pandas import DataFrame\n", + "\n", + "temp = DataFrame(users, columns= ['user_id', 'song_ids','play_count'])\n", + "temp = pd.merge(users, nd)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 419 + }, + "colab_type": "code", + "id": "w8UOHK1zFogN", + "outputId": "aec8c50a-1507-4831-a2dd-6dd758575b77" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
user_idsong_idsplay_countsong_titlesartist_names
0c34670d9c1718361feb93068a853cead3c95b76aSOEHWGF12A6D4F8B2B3Hips Don't Lie (featuring Wyclef Jean)Shakira Featuring Wyclef Jean
1c759e740af57c477fe358e62ad7b3b1f2f113a2fSOEHWGF12A6D4F8B2B6Hips Don't Lie (featuring Wyclef Jean)Shakira Featuring Wyclef Jean
28f6e833948caf895a3281ded74ceb32783916e42SOEHWGF12A6D4F8B2B1Hips Don't Lie (featuring Wyclef Jean)Shakira Featuring Wyclef Jean
38cd07652ccba3754502c8fa8fe809c418fdcdc8fSOEHWGF12A6D4F8B2B2Hips Don't Lie (featuring Wyclef Jean)Shakira Featuring Wyclef Jean
4563e8088cbb8affb096d2334531624a8cf7ff3d2SOEHWGF12A6D4F8B2B5Hips Don't Lie (featuring Wyclef Jean)Shakira Featuring Wyclef Jean
..................
18127a4a85f48a7d787b6e17ed38001abcd032cb87c6aSOKLIMD12A8C145AC31Whiskey on the FireAaron Watson
1812890bac2ccc1660cf444569f3553e6b141d132b2c3SONCEJF12AB018581C1JammingTwinkle Twinkle Little Rock Star
1812946a363f17bd4e07d2c607779877baedafc07e7d7SOKWNWI12A8C13383F1Bianca's Midnight LullabyAl Di Meola
181308ecfca10c16f046ae53634347d6b9029c40425c0SONQKDG12A8C130D961IsabelJuana Molina
18131e43d36faeb14c6982e3721a6503ba8978edb9384SOAWDBP12A8C144CB22Diamond In The RoughSyl Johnson
\n", + "

18132 rows × 5 columns

\n", + "
" + ], + "text/plain": [ + " user_id ... artist_names\n", + "0 c34670d9c1718361feb93068a853cead3c95b76a ... Shakira Featuring Wyclef Jean\n", + "1 c759e740af57c477fe358e62ad7b3b1f2f113a2f ... Shakira Featuring Wyclef Jean\n", + "2 8f6e833948caf895a3281ded74ceb32783916e42 ... Shakira Featuring Wyclef Jean\n", + "3 8cd07652ccba3754502c8fa8fe809c418fdcdc8f ... Shakira Featuring Wyclef Jean\n", + "4 563e8088cbb8affb096d2334531624a8cf7ff3d2 ... Shakira Featuring Wyclef Jean\n", + "... ... ... ...\n", + "18127 a4a85f48a7d787b6e17ed38001abcd032cb87c6a ... Aaron Watson\n", + "18128 90bac2ccc1660cf444569f3553e6b141d132b2c3 ... Twinkle Twinkle Little Rock Star\n", + "18129 46a363f17bd4e07d2c607779877baedafc07e7d7 ... Al Di Meola\n", + "18130 8ecfca10c16f046ae53634347d6b9029c40425c0 ... Juana Molina\n", + "18131 e43d36faeb14c6982e3721a6503ba8978edb9384 ... Syl Johnson\n", + "\n", + "[18132 rows x 5 columns]" + ] + }, + "execution_count": 21, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "temp" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 390 + }, + "colab_type": "code", + "id": "nWV9yDHGyOUl", + "outputId": "73a658da-1c96-4feb-8a6c-edfd0119f53d" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
song_idssong_id_code
0SOEHWGF12A6D4F8B2B253
1SOEHWGF12A6D4F8B2B253
2SOEHWGF12A6D4F8B2B253
3SOEHWGF12A6D4F8B2B253
4SOEHWGF12A6D4F8B2B253
5SOEHWGF12A6D4F8B2B253
6SOEHWGF12A6D4F8B2B253
7SOEHWGF12A6D4F8B2B253
8SOEHWGF12A6D4F8B2B253
9SOEHWGF12A6D4F8B2B253
10SOEHWGF12A6D4F8B2B253
\n", + "
" + ], + "text/plain": [ + " song_ids song_id_code\n", + "0 SOEHWGF12A6D4F8B2B 253\n", + "1 SOEHWGF12A6D4F8B2B 253\n", + "2 SOEHWGF12A6D4F8B2B 253\n", + "3 SOEHWGF12A6D4F8B2B 253\n", + "4 SOEHWGF12A6D4F8B2B 253\n", + "5 SOEHWGF12A6D4F8B2B 253\n", + "6 SOEHWGF12A6D4F8B2B 253\n", + "7 SOEHWGF12A6D4F8B2B 253\n", + "8 SOEHWGF12A6D4F8B2B 253\n", + "9 SOEHWGF12A6D4F8B2B 253\n", + "10 SOEHWGF12A6D4F8B2B 253" + ] + }, + "execution_count": 22, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "from sklearn.preprocessing import LabelEncoder\n", + "\n", + "frame = temp\n", + "lb_make = LabelEncoder()\n", + "frame[\"user_id_code\"] = lb_make.fit_transform(frame[\"user_id\"])\n", + "frame[[\"user_id\", \"user_id_code\"]].head(11)\n", + "\n", + "lb_make2 = LabelEncoder()\n", + "frame[\"song_id_code\"] = lb_make2.fit_transform(frame[\"song_ids\"])\n", + "frame[[\"song_ids\", \"song_id_code\"]].head(11)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 521 + }, + "colab_type": "code", + "id": "urnaD1IpyZZ6", + "outputId": "251fd7bb-dba3-44e3-9dc8-352220068fd6" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
user_idsong_idsplay_countsong_titlesartist_namesuser_id_codesong_id_code
0c34670d9c1718361feb93068a853cead3c95b76aSOEHWGF12A6D4F8B2B3Hips Don't Lie (featuring Wyclef Jean)Shakira Featuring Wyclef Jean12353253
1c759e740af57c477fe358e62ad7b3b1f2f113a2fSOEHWGF12A6D4F8B2B6Hips Don't Lie (featuring Wyclef Jean)Shakira Featuring Wyclef Jean12610253
28f6e833948caf895a3281ded74ceb32783916e42SOEHWGF12A6D4F8B2B1Hips Don't Lie (featuring Wyclef Jean)Shakira Featuring Wyclef Jean8967253
38cd07652ccba3754502c8fa8fe809c418fdcdc8fSOEHWGF12A6D4F8B2B2Hips Don't Lie (featuring Wyclef Jean)Shakira Featuring Wyclef Jean8818253
4563e8088cbb8affb096d2334531624a8cf7ff3d2SOEHWGF12A6D4F8B2B5Hips Don't Lie (featuring Wyclef Jean)Shakira Featuring Wyclef Jean5387253
........................
18127a4a85f48a7d787b6e17ed38001abcd032cb87c6aSOKLIMD12A8C145AC31Whiskey on the FireAaron Watson10359587
1812890bac2ccc1660cf444569f3553e6b141d132b2c3SONCEJF12AB018581C1JammingTwinkle Twinkle Little Rock Star9043703
1812946a363f17bd4e07d2c607779877baedafc07e7d7SOKWNWI12A8C13383F1Bianca's Midnight LullabyAl Di Meola4427604
181308ecfca10c16f046ae53634347d6b9029c40425c0SONQKDG12A8C130D961IsabelJuana Molina8927725
18131e43d36faeb14c6982e3721a6503ba8978edb9384SOAWDBP12A8C144CB22Diamond In The RoughSyl Johnson1438944
\n", + "

18132 rows × 7 columns

\n", + "
" + ], + "text/plain": [ + " user_id ... song_id_code\n", + "0 c34670d9c1718361feb93068a853cead3c95b76a ... 253\n", + "1 c759e740af57c477fe358e62ad7b3b1f2f113a2f ... 253\n", + "2 8f6e833948caf895a3281ded74ceb32783916e42 ... 253\n", + "3 8cd07652ccba3754502c8fa8fe809c418fdcdc8f ... 253\n", + "4 563e8088cbb8affb096d2334531624a8cf7ff3d2 ... 253\n", + "... ... ... ...\n", + "18127 a4a85f48a7d787b6e17ed38001abcd032cb87c6a ... 587\n", + "18128 90bac2ccc1660cf444569f3553e6b141d132b2c3 ... 703\n", + "18129 46a363f17bd4e07d2c607779877baedafc07e7d7 ... 604\n", + "18130 8ecfca10c16f046ae53634347d6b9029c40425c0 ... 725\n", + "18131 e43d36faeb14c6982e3721a6503ba8978edb9384 ... 44\n", + "\n", + "[18132 rows x 7 columns]" + ] + }, + "execution_count": 23, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "frame" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "CQaWupmeyiWr" + }, + "outputs": [], + "source": [ + "export_csv = frame.to_csv (r'./triplets.csv', index = None, header=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "r-8o3ceGpgiM" + }, + "outputs": [], + "source": [ + "# spark imports\n", + "from pyspark.ml.feature import StringIndexer\n", + "from pyspark.ml import Pipeline\n", + "from pyspark.sql.functions import col\n", + "from pyspark.ml.evaluation import RegressionEvaluator\n", + "from pyspark.ml.recommendation import ALS\n", + "from pyspark.sql import SparkSession\n", + "from pyspark.sql.functions import UserDefinedFunction, explode, desc\n", + "from pyspark.sql.types import StringType, ArrayType" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "-d4BjZ-ipoVm" + }, + "outputs": [], + "source": [ + "spark = SparkSession \\\n", + " .builder \\\n", + " .appName(\"Music Recommender System\") \\\n", + " .config(\"spark.driver.maxResultSize\", \"96g\") \\\n", + " .config(\"spark.driver.memory\", \"96g\") \\\n", + " .config(\"spark.executor.memory\", \"8g\") \\\n", + " .config(\"spark.master\", \"local[12]\") \\\n", + " .getOrCreate()\n", + "# get spark context\n", + "sc = spark.sparkContext" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 309 + }, + "colab_type": "code", + "id": "85GstFIJpqHy", + "outputId": "7cd3afca-5d7a-4488-e0ee-b315bcd78080" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+----------------------------------------+------------------+----------+--------------------------------------+-----------------------------+------------+------------+\n", + "|user_id |song_ids |play_count|song_titles |artist_names |user_id_code|song_id_code|\n", + "+----------------------------------------+------------------+----------+--------------------------------------+-----------------------------+------------+------------+\n", + "|c34670d9c1718361feb93068a853cead3c95b76a|SOEHWGF12A6D4F8B2B|3 |Hips Don't Lie (featuring Wyclef Jean)|Shakira Featuring Wyclef Jean|12353 |253 |\n", + "|c759e740af57c477fe358e62ad7b3b1f2f113a2f|SOEHWGF12A6D4F8B2B|6 |Hips Don't Lie (featuring Wyclef Jean)|Shakira Featuring Wyclef Jean|12610 |253 |\n", + "|8f6e833948caf895a3281ded74ceb32783916e42|SOEHWGF12A6D4F8B2B|1 |Hips Don't Lie (featuring Wyclef Jean)|Shakira Featuring Wyclef Jean|8967 |253 |\n", + "|8cd07652ccba3754502c8fa8fe809c418fdcdc8f|SOEHWGF12A6D4F8B2B|2 |Hips Don't Lie (featuring Wyclef Jean)|Shakira Featuring Wyclef Jean|8818 |253 |\n", + "|563e8088cbb8affb096d2334531624a8cf7ff3d2|SOEHWGF12A6D4F8B2B|5 |Hips Don't Lie (featuring Wyclef Jean)|Shakira Featuring Wyclef Jean|5387 |253 |\n", + "|4a76d0d9066dd57060f34f5d9deab05a0e68c8a5|SOEHWGF12A6D4F8B2B|2 |Hips Don't Lie (featuring Wyclef Jean)|Shakira Featuring Wyclef Jean|4671 |253 |\n", + "|82bc6c3eb139e7b024f085e1077675a4aef12476|SOEHWGF12A6D4F8B2B|1 |Hips Don't Lie (featuring Wyclef Jean)|Shakira Featuring Wyclef Jean|8219 |253 |\n", + "|8a8c72ac345403e91362d091db48a700a3d1a6c3|SOEHWGF12A6D4F8B2B|1 |Hips Don't Lie (featuring Wyclef Jean)|Shakira Featuring Wyclef Jean|8679 |253 |\n", + "|e5831bac6afc67cd5241fdd9997f91ddcdd10c8f|SOEHWGF12A6D4F8B2B|2 |Hips Don't Lie (featuring Wyclef Jean)|Shakira Featuring Wyclef Jean|14459 |253 |\n", + "|9655d1fb5c212be843a4e13505add9c4c8d0e648|SOEHWGF12A6D4F8B2B|2 |Hips Don't Lie (featuring Wyclef Jean)|Shakira Featuring Wyclef Jean|9425 |253 |\n", + "+----------------------------------------+------------------+----------+--------------------------------------+-----------------------------+------------+------------+\n", + "only showing top 10 rows\n", + "\n" + ] + } + ], + "source": [ + "df = spark.read.load('./triplets.csv', format='csv', header=True, inferSchema=True)\n", + "df.show(10, truncate=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "-w67_jL8qQTo" + }, + "outputs": [], + "source": [ + "# indexer = [StringIndexer(inputCol=column, outputCol=column+\"_index\") for column in list(set(df.columns)-set(['overall'])) ]\n", + "# pipeline = Pipeline(stages=indexer)\n", + "# transformed = pipeline.fit(df).transform(df)\n", + "# transformed.show(truncate=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "zvofnE_gR8UM" + }, + "outputs": [], + "source": [ + "# user = list(transformed.select('user_id_index').distinct().sort(transformed[\"user_id_index\"])) # Get our unique customers\n", + "# song = list(transformed.select('song_ids_index').distinct().sort(transformed[\"song_ids_index\"])) # Get our unique products that were purchased\n", + "# playCount = list(transformed.select('play_count')) # All of our purchases\n", + "\n", + "# # rows = transformed.select('user_id_index').astype('category', categories = user).cat.codes \n", + "# # # Get the associated row indices\n", + "# # cols = transformed.song_ids_index.astype('category', categories = song).cat.codes \n", + "# # Get the associated column indices\n", + "# # playCount_sparse = sparse.csr_matrix((playCount, (user, song)), shape=(len(user), len(song)))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "OV2o-FcW_1Td" + }, + "outputs": [], + "source": [ + "(training,test)=df.randomSplit([0.8, 0.2])" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "dVzUftH1UwtU" + }, + "outputs": [], + "source": [ + "als=ALS(maxIter=5, regParam=0.09,rank=25,userCol=\"user_id_code\",itemCol=\"song_id_code\",ratingCol=\"play_count\",coldStartStrategy=\"drop\",nonnegative=True)\n", + "model=als.fit(training)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 989 + }, + "colab_type": "code", + "id": "AUHd8hwJV3OD", + "outputId": "270f19b6-e723-40b3-98da-8625499406b5" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+----------------------------------------+------------------+----------+----------------------------------------+----------------------------------------------+------------+------------+----------+\n", + "|user_id |song_ids |play_count|song_titles |artist_names |user_id_code|song_id_code|prediction|\n", + "+----------------------------------------+------------------+----------+----------------------------------------+----------------------------------------------+------------+------------+----------+\n", + "|e9540efbbef64e43274b9243242a6b7805d9ea23|SOQHTUT12A8AE475F2|1 |Let It Go |Kirk Franklin with tobyMac & Sonny (of P.O.D.)|14669 |833 |0.45323807|\n", + "|50b6af13a2dab6f62d6fcb40857e6858cb1d277a|SOQHTUT12A8AE475F2|1 |Let It Go |Kirk Franklin with tobyMac & Sonny (of P.O.D.)|5026 |833 |0.14361864|\n", + "|6b7325774444b6833a431c6568ecc1a1dc13137e|SOHCYND12AF72A3CD9|2 |Deliverance |Sick Puppies |6718 |392 |0.18159722|\n", + "|5676285d65ae3916cffc7306e4cdd57e87a19564|SOHCYND12AF72A3CD9|2 |Deliverance |Sick Puppies |5400 |392 |0.12738255|\n", + "|13107c1047c7aa78b77abdd569c5a8a2d0656f4b|SOHCYND12AF72A3CD9|1 |Deliverance |Sick Puppies |1213 |392 |0.3783775 |\n", + "|f730ace25b605210df87b2f8f7e786098f2e9bdc|SOHCYND12AF72A3CD9|1 |Deliverance |Sick Puppies |15522 |392 |0.09791306|\n", + "|db4a617f8b2591dd9c9fb4fc3cacc6fc4664301e|SORNVVT12AF72A0C39|1 |Intro 2/ Kick Out The Jams (LP Version) |MC5 |13831 |897 |4.464061 |\n", + "|7570c8d981604a55303eabae535d4893c9d88ed3|SOWGZFG12A8151AF41|3 |Monsoon |Jack Johnson |7365 |1139 |0.6967279 |\n", + "|c79757a61275da9490f190ce26839bce70051223|SOWGZFG12A8151AF41|1 |Monsoon |Jack Johnson |12636 |1139 |0.43220574|\n", + "|aa8e076a5bb5d588640cb44475538115dd00e734|SOBCKIM12A8C13936C|2 |Pero Me Acuerdo De Tí |Christina Aguilera |10739 |65 |0.20451252|\n", + "|66b888018aaa0c9650e57695a7a280b5c8439cde|SOBCKIM12A8C13936C|2 |Pero Me Acuerdo De Tí |Christina Aguilera |6384 |65 |0.20208909|\n", + "|9fcad0a2a2e70d2b5c08d636c1f832a6cd1787c5|SOBCKIM12A8C13936C|5 |Pero Me Acuerdo De Tí |Christina Aguilera |10044 |65 |0.24047722|\n", + "|cc08a89168e4626e96c4add2741428cc6bb9580f|SOBCKIM12A8C13936C|1 |Pero Me Acuerdo De Tí |Christina Aguilera |12898 |65 |0.46032727|\n", + "|866852a40ef28805eb08345db0ea5f83298dff33|SOPOPLW12A8C13A905|2 |Umbrella |All Time Low |8438 |804 |0.7917186 |\n", + "|77e9be7a7aeb763c7281f175af5b0f8e137ef05e|SOWQTQZ12A58A7B63E|6 |Streets On Fire (Explicit Album Version)|Lupe Fiasco |7530 |1157 |3.3458128 |\n", + "|feb4add07933d0513582357eb37acfaffdd6c1ed|SOWQTQZ12A58A7B63E|13 |Streets On Fire (Explicit Album Version)|Lupe Fiasco |16002 |1157 |7.806897 |\n", + "|03b5cdbea481827ebe9be7e1834f3926039478fd|SOWQTQZ12A58A7B63E|2 |Streets On Fire (Explicit Album Version)|Lupe Fiasco |246 |1157 |0.55763555|\n", + "|8f8718a02b26e245271e4c97cd1bd879d3a906ab|SOWQTQZ12A58A7B63E|1 |Streets On Fire (Explicit Album Version)|Lupe Fiasco |8975 |1157 |0.7940686 |\n", + "|8caa525aa6d5e4b3ca496ef66474cb13b940d167|SOWQTQZ12A58A7B63E|1 |Streets On Fire (Explicit Album Version)|Lupe Fiasco |8802 |1157 |1.1152711 |\n", + "|a8d16acb9faa12319d1f02c608e152499a49bbc4|SOWQTQZ12A58A7B63E|1 |Streets On Fire (Explicit Album Version)|Lupe Fiasco |10616 |1157 |1.2735506 |\n", + "|ba52d1f72421e85d8ec9a7710fa241701789e95d|SOWQTQZ12A58A7B63E|1 |Streets On Fire (Explicit Album Version)|Lupe Fiasco |11797 |1157 |0.7973523 |\n", + "|fbb95b3033414a8c1eca2f84e2a2a06c566b5419|SOQMWJG12A6701E1AC|1 |Mistadobalina |Del Tha Funkee Homosapien |15815 |853 |0.32017633|\n", + "|810763837886194a5a29369fbf90e2c94c69f8ec|SOBJUKG12A58A7DCA8|3 |Two Hearts |Phil Collins |8082 |78 |2.3471355 |\n", + "|7f6b98f36f7d8ab61bc7369ba7e852dc68cff13d|SOBJUKG12A58A7DCA8|1 |Two Hearts |Phil Collins |7985 |78 |2.5378666 |\n", + "|3df157f6460ccd6c5d2e7668f346b3aacec3cee0|SOSYKKS12A8C1388DF|3 |I've Been Missin' You |Kenny G |3859 |961 |1.7619411 |\n", + "|aeb1c5c11b789ff1a539df055ef98d3e74ba9c15|SOSYKKS12A8C1388DF|1 |I've Been Missin' You |Kenny G |10998 |961 |0.06636223|\n", + "|79bc03969de1477795a38424217ce64b3c6fea8a|SOGRXZY12A8C139043|2 |Thrill Me |Simply Red |7635 |375 |3.0921402 |\n", + "|0dfda19a8fe30d8d73dc7877b71274b5288ec4c4|SOSQIHH12A8C13370B|6 |15 Step |Radiohead |898 |950 |0.50227386|\n", + "|8aeeb65f0268b7a05000e6d3134ce90556a5bc59|SOSQIHH12A8C13370B|1 |15 Step |Radiohead |8701 |950 |0.17800006|\n", + "|5b88f92853699ce0e2f01c94811e9b4b738bbc56|SOSQIHH12A8C13370B|5 |15 Step |Radiohead |5708 |950 |0.12803972|\n", + "|a4f7814a2d41fe3ee56d4d9ec61065c0eb4e34c2|SOSQIHH12A8C13370B|5 |15 Step |Radiohead |10376 |950 |0.40219158|\n", + "|b2084be1b2af9e87342c4f50afc38aa60262e143|SOSQIHH12A8C13370B|1 |15 Step |Radiohead |11211 |950 |0.2892505 |\n", + "|00a36168ed80334a6816e1feefd5b40aba212e31|SOSQIHH12A8C13370B|1 |15 Step |Radiohead |39 |950 |0.76593107|\n", + "|67156d29151420f8dc1a07c4ffb0503cd68e6af2|SOSQIHH12A8C13370B|1 |15 Step |Radiohead |6408 |950 |0.39203826|\n", + "|d68df3e077f0f7186a253b9d7fbc46bbab9729c7|SOSQIHH12A8C13370B|1 |15 Step |Radiohead |13550 |950 |0.21767785|\n", + "|a27b290959968b0a68fc0413c68168abc42862cb|SOSQIHH12A8C13370B|6 |15 Step |Radiohead |10226 |950 |0.26897588|\n", + "|9a25d037f6baa53e68718ad5a1efa29eee5f616b|SOSQIHH12A8C13370B|2 |15 Step |Radiohead |9681 |950 |1.088389 |\n", + "|4754b7dd2044458b395bc48e0234ac15e6866db9|SOSQIHH12A8C13370B|1 |15 Step |Radiohead |4479 |950 |0.37529486|\n", + "|ed4cc725685df08ccf7b91c41849593c635cf472|SOSQIHH12A8C13370B|1 |15 Step |Radiohead |14894 |950 |0.18009022|\n", + "|bc18fe85c530d64b1f3f3ec379d99101ca514335|SOSQIHH12A8C13370B|1 |15 Step |Radiohead |11926 |950 |1.0580803 |\n", + "|6fc14b3e06c448a9d5d7a62c3690e7f6a82ac5a7|SOCGOZK12A8151BD5D|1 |Fake Tales Of San Francisco |Arctic Monkeys |6997 |126 |0.5295702 |\n", + "|67b96f36e135b5f8bb2b225df02b3ab3b60a53c1|SOCGOZK12A8151BD5D|1 |Fake Tales Of San Francisco |Arctic Monkeys |6453 |126 |1.1715788 |\n", + "|4c82312f9bbcc5959d3488629f84f13511942f81|SOCGOZK12A8151BD5D|2 |Fake Tales Of San Francisco |Arctic Monkeys |4769 |126 |0.25347772|\n", + "|81ed9ee674cc9629c312241d63385b070459077e|SOCGOZK12A8151BD5D|1 |Fake Tales Of San Francisco |Arctic Monkeys |8148 |126 |0.65165347|\n", + "|c09b819115c01fe81a1a05be3dc4e584d204c662|SOCGOZK12A8151BD5D|2 |Fake Tales Of San Francisco |Arctic Monkeys |12188 |126 |2.1347234 |\n", + "|7d3132b7aa8341f5d7515fb59e38f03d7f068082|SOOGKOY12B34F33114|5 |Refuge |Matisyahu |7847 |756 |0.6455815 |\n", + "|fbcf8182103b622c489933422f64e9b57e10c020|SOOGKOY12B34F33114|2 |Refuge |Matisyahu |15822 |756 |1.5800511 |\n", + "|05cc826cf9112e83d84f1cecd44fc0e527b047fd|SOQLNEY12B0B8062FA|2 |Dancing Shoes |Arctic Monkeys |368 |847 |0.70986754|\n", + "|47f2b4e16751254b0c0545328e77c5e4d249c1ce|SOQLNEY12B0B8062FA|9 |Dancing Shoes |Arctic Monkeys |4521 |847 |0.48080844|\n", + "|b154143628bfdc0efc14e0229cad21a18a9cf4ad|SOQLNEY12B0B8062FA|1 |Dancing Shoes |Arctic Monkeys |11168 |847 |0.48080844|\n", + "+----------------------------------------+------------------+----------+----------------------------------------+----------------------------------------------+------------+------------+----------+\n", + "only showing top 50 rows\n", + "\n" + ] + } + ], + "source": [ + "evaluator=RegressionEvaluator(metricName=\"rmse\",labelCol=\"play_count\",predictionCol=\"prediction\")\n", + "predictions=model.transform(test)\n", + "predictions.show(50, truncate = False)" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "ELdFbYzQN6mO" + }, + "outputs": [], + "source": [ + "rmse = evaluator.evaluate(predictions)" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "colab_type": "code", + "id": "uIG74SmqaVmo", + "outputId": "90f2d36a-aeea-467d-f9e5-f14db4dd9156" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Root-mean-square error = 5.517126413712533\n" + ] + } + ], + "source": [ + "print(\"Root-mean-square error = \" + str(rmse))" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 309 + }, + "colab_type": "code", + "id": "ZkcnWBalB84v", + "outputId": "efe636ea-059e-4ec8-a37b-ea0f7b5a6be0" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+-------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", + "|user_id_index|recommendations |\n", + "+-------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", + "|148 |[[132559, 128.63263], [147680, 83.976524], [66419, 82.88117], [125845, 76.72285], [82226, 76.19292], [39411, 76.14007], [162509, 75.64509], [99909, 63.91176], [98323, 63.563046], [117480, 62.751663]] |\n", + "|463 |[[50694, 81.836334], [39411, 64.48308], [147680, 64.23534], [122151, 61.286102], [91642, 56.230762], [18266, 45.621635], [132559, 45.549026], [162509, 43.640633], [125845, 39.744972], [28504, 38.03746]] |\n", + "|471 |[[91642, 166.9629], [90521, 82.83951], [118079, 81.80899], [90425, 70.81573], [28504, 69.14364], [125845, 65.72644], [130593, 63.165348], [147680, 60.90121], [123867, 60.728004], [116217, 54.02317]] |\n", + "|496 |[[98323, 561.9435], [159673, 237.96635], [29924, 204.07669], [130289, 202.01738], [162509, 188.40092], [64530, 180.07327], [96723, 176.96783], [47412, 176.5399], [117683, 176.40698], [94070, 173.90211]] |\n", + "|833 |[[125845, 261.29282], [162509, 211.07877], [91642, 209.26482], [90521, 200.1382], [39411, 183.05717], [132559, 174.52623], [50694, 170.21997], [147680, 165.52065], [82226, 135.1852], [93177, 130.17105]] |\n", + "|1088 |[[91642, 477.74738], [132559, 301.17938], [98323, 163.98624], [123867, 163.49843], [130593, 150.79263], [147680, 148.13669], [28504, 145.4549], [90521, 139.62958], [162509, 136.77386], [122151, 136.32388]]|\n", + "|1238 |[[18266, 157.90025], [91642, 144.36684], [50694, 119.0692], [122151, 78.154465], [11315, 73.731895], [62883, 68.069824], [36371, 66.961914], [154520, 66.59154], [9336, 64.87565], [63740, 64.10445]] |\n", + "|1342 |[[132559, 215.22742], [32380, 146.98671], [123867, 143.82867], [40945, 137.36111], [117480, 121.496414], [36371, 117.13508], [91642, 107.41648], [21660, 107.31862], [98323, 104.51557], [46713, 104.25622]] |\n", + "|1580 |[[132559, 347.78375], [98323, 195.82375], [159673, 132.96431], [51399, 103.85994], [64530, 102.61894], [162509, 90.60711], [90425, 89.49118], [23038, 87.83676], [36371, 78.12712], [36489, 73.4358]] |\n", + "|1591 |[[50694, 125.0975], [122151, 99.453705], [88869, 85.341286], [132559, 70.60342], [91642, 66.271194], [80202, 65.54762], [147680, 63.61119], [162509, 47.968006], [66419, 47.93394], [47290, 46.066273]] |\n", + "+-------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", + "only showing top 10 rows\n", + "\n" + ] + } + ], + "source": [ + "# user_recs=model.recommendForAllUsers(10).show(10, truncate = False)" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "skM3poAyKgfu" + }, + "outputs": [], + "source": [ + "recs=model.recommendForAllUsers(10).toPandas()" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 419 + }, + "colab_type": "code", + "id": "7AiEvI4Bmnh3", + "outputId": "d1e2733a-172c-4ab5-b92d-72783cab6741" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
user_id_coderecommendations
01580[(226, 12.034584999084473), (990, 7.5423817634...
14900[(226, 12.202627182006836), (339, 3.8053884506...
26620[(226, 93.89700317382812), (643, 57.0851860046...
37340[(704, 114.73605346679688), (226, 99.090141296...
47880[(226, 47.703304290771484), (704, 34.140014648...
.........
131346438[(226, 40.68645477294922), (792, 13.7023382186...
1313515908[(226, 11.6093168258667), (120, 6.681258678436...
1313689[(226, 4.944281578063965), (979, 2.78582954406...
131377999[(226, 67.30372619628906), (990, 64.1438751220...
1313814879[(226, 9.831428527832031), (704, 4.22424602508...
\n", + "

13139 rows × 2 columns

\n", + "
" + ], + "text/plain": [ + " user_id_code recommendations\n", + "0 1580 [(226, 12.034584999084473), (990, 7.5423817634...\n", + "1 4900 [(226, 12.202627182006836), (339, 3.8053884506...\n", + "2 6620 [(226, 93.89700317382812), (643, 57.0851860046...\n", + "3 7340 [(704, 114.73605346679688), (226, 99.090141296...\n", + "4 7880 [(226, 47.703304290771484), (704, 34.140014648...\n", + "... ... ...\n", + "13134 6438 [(226, 40.68645477294922), (792, 13.7023382186...\n", + "13135 15908 [(226, 11.6093168258667), (120, 6.681258678436...\n", + "13136 89 [(226, 4.944281578063965), (979, 2.78582954406...\n", + "13137 7999 [(226, 67.30372619628906), (990, 64.1438751220...\n", + "13138 14879 [(226, 9.831428527832031), (704, 4.22424602508...\n", + "\n", + "[13139 rows x 2 columns]" + ] + }, + "execution_count": 32, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "recs" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "colab_type": "code", + "id": "P8-lZYvERY3i", + "outputId": "3634d7f3-8a91-4918-c5be-828188d7e173" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(13139, 2)" + ] + }, + "execution_count": 33, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "recs.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "FZ7pGPqH6KWM" + }, + "outputs": [], + "source": [ + "song_df = pd.read_csv('/content/gdrive/My Drive/MscsDs/MillionSongSubset/msd.csv')" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 615 + }, + "colab_type": "code", + "id": "eTlNUFt46Pe8", + "outputId": "447047ff-0873-462d-a454-6b6f16529bf5" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Unnamed: 0Unnamed: 0.1song_idssong_titlessong_durationssong_realease_yearsartist_namessong_hotnesssong_temposong_energiessong_danceabilitysong_barssong_beatssong_time_signaturessong_tatumsong_modessong_keysartist_familiartyartist_hotness
000SONHTWP12A8C142744Vals '89162.585670Manolis Famellos & I PodilatesNaN94.3010.00.0[ 1.45502 3.39383 5.32826 7.25953 9.1...[ 0.16441 0.80395 1.45502 2.09102 2.7...3[ 0.16441 0.48418 0.80395 1.13522 1.4...100.2287300.000000
111SOPIHMB12AC468E0DDGhost of the Ocean (Live)214.255870Uriah Heep0.2502149.9210.00.0[ 1.20218 2.80457 4.39266 5.98514 7.5...[ 0.38752 0.79653 1.20218 1.60244 2.0...4[ 0.2523 0.38752 0.52273 ... 212.97102 2...170.6732390.479205
222SODRPJT12AC468DEF1The frog song169.873830Alain-FrançoisNaN136.0440.00.0[ 1.37397 4.48312 7.56804 10.65675 13.7...[ 0.48609 0.93058 1.37397 1.81958 2.2...7[ 0.26328 0.48609 0.70778 0.93058 1.1...120.3803170.300918
333SOLLOTO12AB01804C6Deep Blue Sea (Daniel Rossen home recording)351.503222008Grizzly BearNaN85.0030.00.0[ 0.72449 3.55798 6.37712 9.20176 12.0...[ 0.72449 1.43405 2.1445 2.85228 3.5...4[1.8653000e-01 3.6881000e-01 5.4665000e-01 ......190.7606360.547244
444SOCNYGS12AB01832B8La vérité252.446892007Annie Blanchard0.0000113.2870.00.0[2.2334000e-01 2.3324800e+00 4.4484000e+00 6.5...[2.2334000e-01 7.5000000e-01 1.2775800e+00 1.8...4[2.2334000e-01 3.9890000e-01 5.7445000e-01 ......150.4797350.352460
\n", + "
" + ], + "text/plain": [ + " Unnamed: 0 Unnamed: 0.1 ... artist_familiarty artist_hotness\n", + "0 0 0 ... 0.228730 0.000000\n", + "1 1 1 ... 0.673239 0.479205\n", + "2 2 2 ... 0.380317 0.300918\n", + "3 3 3 ... 0.760636 0.547244\n", + "4 4 4 ... 0.479735 0.352460\n", + "\n", + "[5 rows x 19 columns]" + ] + }, + "execution_count": 35, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "song_df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 527 + }, + "colab_type": "code", + "id": "yhmzMcDr9syW", + "outputId": "a4d0fcc8-21d5-469d-ba2c-cc42ea7e973e" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Recommendation to user 1580 : \n", + " Song: Till There Was You (John Creamer & Stephane K Remix)\n", + " Artist: Rachael Starr\n", + " Recommendation to user 1580 : \n", + " Song: Are You There (With Another Girl)\n", + " Artist: Burt Bacharach\n", + " Recommendation to user 1580 : \n", + " Song: The Dynamo Of Volition [From An All Night Session]\n", + " Artist: Jason Mraz\n", + " Recommendation to user 1580 : \n", + " Song: La mujer que no sone (Album)\n", + " Artist: Ricardo Arjona\n", + " Recommendation to user 1580 : \n", + " Song: Mas P**' (America'S Mexican)\n", + " Artist: George Lopez\n", + " Recommendation to user 1580 : \n", + " Song: Love Ain't No Stranger (2003 Digital Remaster)\n", + " Artist: Whitesnake\n", + " Recommendation to user 1580 : \n", + " Song: Illuminate\n", + " Artist: Orbital\n", + " Recommendation to user 1580 : \n", + " Song: Song From Moulin Rouge\n", + " Artist: Percy Faith & His Orchestra\n", + " Recommendation to user 1580 : \n", + " Song: Camino\n", + " Artist: Gipsy Kings\n", + " Recommendation to user 1580 : \n", + " Song: Set The World On Fire\n", + " Artist: Britt Nicole\n" + ] + } + ], + "source": [ + "count = 0\n", + "song_id_found = set()\n", + "for recValue in recs.values:\n", + " for item in recValue[1]:\n", + " row = frame.loc[frame['song_id_code'] == item.song_id_code]\n", + " song_id = row.song_ids.values[0]\n", + " if ( song_id not in song_id_found) and (song_df.loc[ song_df['song_ids'] == song_id].shape[0] == 1):\n", + " rowDetails = song_df.loc[ song_df['song_ids'] == song_id]\n", + " print(\" Recommendation to user \", recValue[0], \" : \")\n", + " print(\" Song: \", rowDetails.song_titles.values[0]) \n", + " print(\" Artist: \", rowDetails.artist_names.values[0])\n", + " song_id_found.add(song_id)\n", + " count += 20\n", + " \n", + " if count > 20:\n", + " break" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 714 + }, + "colab_type": "code", + "id": "WyW00de2BjBT", + "outputId": "0b8f9789-97e5-4ee1-ebe0-6b16f5e91386" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Recommendation to user 148 : \n", + "\n", + " Song ID: SODUSRP12A6D4FA762\n", + " Song: Till There Was You (John Creamer & Stephane K Remix)\n", + " Artist: Rachael Starr\n", + "\n", + " Song ID: SONCQTI12A8AE477B2\n", + " Song: Mas P**' (America'S Mexican)\n", + " Artist: George Lopez\n", + "\n", + " Song ID: SOPHJIS12AC3DF5FA3\n", + " Song: La mujer que no sone (Album)\n", + " Artist: Ricardo Arjona\n", + "\n", + " Song ID: SOCDAIR12A8C131F89\n", + " Song: The Dynamo Of Volition [From An All Night Session]\n", + " Artist: Jason Mraz\n", + "\n", + " Song ID: SOTMGME12AB017F79B\n", + " Song: Are You There (With Another Girl)\n", + " Artist: Burt Bacharach\n", + "\n", + " Song ID: SOLTZTZ12A58A7A84F\n", + " Song: Best Friends\n", + " Artist: Kieran\n", + "\n", + " Song ID: SOOBUUM12A8C13696A\n", + " Song: Telling Me Lies\n", + " Artist: Dolores Keane\n", + "\n", + " Song ID: SOGLETQ12AB0186E93\n", + " Song: Pose No Threat\n", + " Artist: Lunasicc\n", + "\n", + " Song ID: SOGEQKA12A6D4FA27C\n", + " Song: Love Ain't No Stranger (2003 Digital Remaster)\n", + " Artist: Whitesnake\n", + "\n", + " Song ID: SOITOFS12A81C21D00\n", + " Song: Camino\n", + " Artist: Gipsy Kings\n" + ] + } + ], + "source": [ + "print(\" Recommendation to user 148 : \")\n", + "for recom in recs.query('user_id_code == 148').recommendations:\n", + " for item in recom:\n", + " row = frame.loc[frame['song_id_code'] == item.song_id_code]\n", + " print(\"\\n Song ID: \", row.song_ids.values[0])\n", + " song_id = row.song_ids.values[0]\n", + " if song_df.loc[ song_df['song_ids'] == song_id].shape[0] == 1:\n", + " rowDetails = song_df.loc[ song_df['song_ids'] == song_id]\n", + " print(\" Song: \", rowDetails.song_titles.values[0]) \n", + " print(\" Artist: \", rowDetails.artist_names.values[0])" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 714 + }, + "colab_type": "code", + "id": "KgKOnwXg7xXH", + "outputId": "51efbb7f-09a8-4fe6-baca-013043748d19" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Recommendation to user 6438 : \n", + "\n", + " Song ID: SODUSRP12A6D4FA762\n", + " Song: Till There Was You (John Creamer & Stephane K Remix)\n", + " Artist: Rachael Starr\n", + "\n", + " Song ID: SOPHJIS12AC3DF5FA3\n", + " Song: La mujer que no sone (Album)\n", + " Artist: Ricardo Arjona\n", + "\n", + " Song ID: SOGLETQ12AB0186E93\n", + " Song: Pose No Threat\n", + " Artist: Lunasicc\n", + "\n", + " Song ID: SOVFRDB12AB017FF3A\n", + " Song: Got It Twisted\n", + " Artist: Mobb Deep\n", + "\n", + " Song ID: SOTHZUA12A8C13268A\n", + " Song: All I Ask For (Album Version)\n", + " Artist: Ill Nino\n", + "\n", + " Song ID: SOZAQVA12AB0183627\n", + " Song: Eight More Miles To Louisville\n", + " Artist: Jim Kweskin\n", + "\n", + " Song ID: SOITOFS12A81C21D00\n", + " Song: Camino\n", + " Artist: Gipsy Kings\n", + "\n", + " Song ID: SONCQTI12A8AE477B2\n", + " Song: Mas P**' (America'S Mexican)\n", + " Artist: George Lopez\n", + "\n", + " Song ID: SOVMKKT12A58A7F0CC\n", + " Song: Love Unlimited (Explicit)\n", + " Artist: Fun Lovin' Criminals\n", + "\n", + " Song ID: SOCDAIR12A8C131F89\n", + " Song: The Dynamo Of Volition [From An All Night Session]\n", + " Artist: Jason Mraz\n" + ] + } + ], + "source": [ + "print(\" Recommendation to user 6438 : \")\n", + "for recom in recs.query('user_id_code == 6438').recommendations:\n", + " for item in recom:\n", + " row = frame.loc[frame['song_id_code'] == item.song_id_code]\n", + " print(\"\\n Song ID: \", row.song_ids.values[0])\n", + " song_id = row.song_ids.values[0]\n", + " if song_df.loc[ song_df['song_ids'] == song_id].shape[0] == 1:\n", + " rowDetails = song_df.loc[ song_df['song_ids'] == song_id]\n", + " print(\" Song: \", rowDetails.song_titles.values[0]) \n", + " print(\" Artist: \", rowDetails.artist_names.values[0])" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "cuYEjO_xDOPn" + }, + "outputs": [], + "source": [ + "rec_item = model.recommendForAllItems(10).toPandas()" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 419 + }, + "colab_type": "code", + "id": "rJdU43jpDi7c", + "outputId": "438d8b85-4eee-4304-9135-0c2fccd04002" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
song_id_coderecommendations
0471[(6241, 18.191701889038086), (424, 14.06768226...
1463[(424, 17.405658721923828), (1907, 15.71860694...
2833[(12902, 39.05113220214844), (117, 29.65908813...
3496[(6241, 13.5421142578125), (6223, 12.761930465...
4148[(6241, 227.50213623046875), (13241, 131.88528...
.........
1204401[(6241, 36.72122573852539), (424, 23.037067413...
1205422[(6241, 21.395238876342773), (424, 19.07993888...
1206517[(12902, 30.867374420166016), (117, 23.4435768...
12071138[(12902, 35.97333908081055), (424, 33.69433212...
120889[(6241, 26.182523727416992), (13241, 15.178276...
\n", + "

1209 rows × 2 columns

\n", + "
" + ], + "text/plain": [ + " song_id_code recommendations\n", + "0 471 [(6241, 18.191701889038086), (424, 14.06768226...\n", + "1 463 [(424, 17.405658721923828), (1907, 15.71860694...\n", + "2 833 [(12902, 39.05113220214844), (117, 29.65908813...\n", + "3 496 [(6241, 13.5421142578125), (6223, 12.761930465...\n", + "4 148 [(6241, 227.50213623046875), (13241, 131.88528...\n", + "... ... ...\n", + "1204 401 [(6241, 36.72122573852539), (424, 23.037067413...\n", + "1205 422 [(6241, 21.395238876342773), (424, 19.07993888...\n", + "1206 517 [(12902, 30.867374420166016), (117, 23.4435768...\n", + "1207 1138 [(12902, 35.97333908081055), (424, 33.69433212...\n", + "1208 89 [(6241, 26.182523727416992), (13241, 15.178276...\n", + "\n", + "[1209 rows x 2 columns]" + ] + }, + "execution_count": 46, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "rec_item" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "eSpkj5-BNZqc" + }, + "outputs": [], + "source": [ + "# print(\" Recommendation for 1138 : \")\n", + "# for recom in rec_item.query('song_id_code == 1138').recommendations:\n", + "# for item in recom:\n", + "# row = frame.loc[frame['user_id_code'] == item.user_id_code]\n", + "# print(\"\\n user_id ID: \", row.user_id.values[0])\n", + "# user_id = row.user_id.values[0]\n", + "# if frame.loc[ frame['user_id'] == user_id].shape[0] > 0:\n", + "# rowDetails = frame.loc[ frame['user_id'] == song_id]\n", + "# print(rowDetails.values)\n", + "# print(\" Song: \", rowDetails.song_titles.values[0]) \n", + "# print(\" Artist: \", rowDetails.artist_names.values[0])" + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "collapsed_sections": [], + "name": "Subset_Spark_ALS.ipynb", + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +}
+
+ +
+
+
+

Install Java, Spark, and Findspark

This installs Apache Spark 2.3.2, Java 8, and Findspark, a library that makes it easy for Python to find Spark.

+ +
+
+
+
+
+
In [0]:
+
+
+
import os
+import time
+
+# data science imports
+import math
+import numpy as np
+import pandas as pd
+from scipy.sparse import csr_matrix
+from sklearn.neighbors import NearestNeighbors
+
+# utils import
+#from fuzzywuzzy import fuzz
+
+# visualization imports
+import seaborn as sns
+import matplotlib.pyplot as plt
+plt.style.use('ggplot')
+
+%matplotlib inline
+
+ +
+
+
+ +
+
+
+
In [2]:
+
+
+
from google.colab import drive
+drive.mount('/content/gdrive')
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
Drive already mounted at /content/gdrive; to attempt to forcibly remount, call drive.mount("/content/gdrive", force_remount=True).
+
+
+
+ +
+
+ +
+
+
+
In [0]:
+
+
+
!cp /content/gdrive/My\ Drive/MscsDs/msdchallenge/kaggle_visible_evaluation_triplets.txt .
+
+ +
+
+
+ +
+
+
+
In [0]:
+
+
+
!cp -r /content/gdrive/My\ Drive/MscsDs/MSongsDB-master/PythonSrc .
+
+ +
+
+
+ +
+
+
+
In [0]:
+
+
+
# ! cd /content/gdrive/My\ Drive/MscsDs/ && tar -zxvf millionsongsubset_full.tar.gz
+
+ +
+
+
+ +
+
+
+
In [0]:
+
+
+
import glob
+files = glob.glob('/content/gdrive/My Drive/MscsDs/MillionSongSubset/data/A/*/*/*.h5')
+
+ +
+
+
+ +
+
+
+
In [142]:
+
+
+
len(files)
+
+ +
+
+
+ +
+
+ + +
+ +
Out[142]:
+ + + + +
+
7620
+
+ +
+ +
+
+ +
+
+
+
In [0]:
+
+
+
import sys
+sys.path.append('./PythonSrc')
+
+import hdf5_utils as HDF5
+import hdf5_getters as g
+
+ +
+
+
+ +
+
+
+
In [0]:
+
+
+
artist_names = []
+song_id = []
+song_titles =[]
+song_durations =[]
+song_release_years =[] #year when this song was released, according to musicbrainz.org
+song_hotness  =[]
+song_tempo = []
+song_energies = []
+song_danceability = []
+song_bars =[]
+song_beats = []
+song_time_signatures =[]
+song_tatum =[]
+song_modes=[]
+song_keys=[]
+artist_familiarty = []
+artist_hotness = []
+
+for f in files:
+    
+    h5 = HDF5.open_h5_file_read(f)
+    
+    song_idss = g.get_song_id(h5).decode('utf-8')
+    song_title = g.get_title(h5).decode('utf-8')
+    song_duration = g.get_duration(h5)
+    song_release_year = g.get_year(h5)
+    song_hot = g.get_song_hotttnesss (h5)
+    song_speed = g.get_tempo(h5)
+    song_energy = g.get_energy(h5)
+    artist_name = g.get_artist_name(h5).decode('utf-8')
+    song_dance = g.get_danceability(h5)
+    song_bar = g.get_bars_start(h5)
+    song_beat = g.get_beats_start(h5)
+    song_time_signature = g.get_time_signature(h5)
+    song_tat = g.get_tatums_start(h5)
+    song_mode = g.get_mode(h5)
+    song_key = g.get_key(h5)
+    artist_familar = g.get_artist_familiarity(h5)
+    artist_hot = g.get_artist_hotttnesss(h5)
+    
+    song_id.append(song_idss)
+    song_titles.append(song_title)
+    song_durations.append(song_duration)
+    song_release_years.append(song_release_year)
+    song_hotness.append(song_hot)
+    song_energies.append(song_energy)
+    song_tempo.append(song_speed)
+    artist_names.append(artist_name)
+    song_danceability.append(song_dance)
+    song_bars.append(song_bar)
+    song_beats.append(song_beat)
+    song_time_signatures.append(song_time_signature)
+    song_tatum.append(song_tat)
+    song_modes.append(song_mode)
+    song_keys.append(song_key)
+    artist_familiarty.append(artist_familar)
+    artist_hotness.append(artist_hot)
+    
+    h5.close()
+
+ +
+
+
+ +
+
+
+
In [145]:
+
+
+
song_id[2]
+
+ +
+
+
+ +
+
+ + +
+ +
Out[145]:
+ + + + +
+
'SODRPJT12AC468DEF1'
+
+ +
+ +
+
+ +
+
+
+
In [0]:
+
+
+
data = {'song_ids':song_id
+        ,'song_titles':song_titles
+        ,'song_durations':song_durations
+        ,'song_realease_years':song_release_years
+        ,'artist_names':artist_names
+        ,'song_hotness':song_hotness
+        ,'song_tempo':song_tempo
+        ,'song_energies':song_energies
+        ,'song_danceability':song_danceability
+        ,'song_bars':song_bars
+        ,'song_beats':song_beats
+        ,'song_time_signatures':song_time_signatures
+        ,'song_tatum':song_tatum
+        ,'song_modes':song_modes
+        ,'song_keys':song_keys
+        ,'artist_familiarty':artist_familiarty
+        ,'artist_hotness':artist_hotness
+       }
+
+ +
+
+
+ +
+
+
+
In [0]:
+
+
+
# To use the data loaded from hd5 files
+# df=pd.DataFrame(data)
+
+# To save the data to csv files
+# df.to_csv('/content/gdrive/My Drive/MscsDs/MillionSongSubset/msd.csv', sep=',')
+
+ +
+
+
+ +
+
+
+
+

Loading the data from saved dataframe

+ +
+
+
+
+
+
In [0]:
+
+
+
df = pd.read_csv('/content/gdrive/My Drive/MscsDs/MillionSongSubset/msd.csv')
+
+ +
+
+
+ +
+
+
+
In [5]:
+
+
+
df.head()
+
+ +
+
+
+ +
+
+ + +
+ +
Out[5]:
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Unnamed: 0Unnamed: 0.1song_idssong_titlessong_durationssong_realease_yearsartist_namessong_hotnesssong_temposong_energiessong_danceabilitysong_barssong_beatssong_time_signaturessong_tatumsong_modessong_keysartist_familiartyartist_hotness
000SONHTWP12A8C142744Vals '89162.585670Manolis Famellos & I PodilatesNaN94.3010.00.0[ 1.45502 3.39383 5.32826 7.25953 9.1...[ 0.16441 0.80395 1.45502 2.09102 2.7...3[ 0.16441 0.48418 0.80395 1.13522 1.4...100.2287300.000000
111SOPIHMB12AC468E0DDGhost of the Ocean (Live)214.255870Uriah Heep0.2502149.9210.00.0[ 1.20218 2.80457 4.39266 5.98514 7.5...[ 0.38752 0.79653 1.20218 1.60244 2.0...4[ 0.2523 0.38752 0.52273 ... 212.97102 2...170.6732390.479205
222SODRPJT12AC468DEF1The frog song169.873830Alain-FrançoisNaN136.0440.00.0[ 1.37397 4.48312 7.56804 10.65675 13.7...[ 0.48609 0.93058 1.37397 1.81958 2.2...7[ 0.26328 0.48609 0.70778 0.93058 1.1...120.3803170.300918
333SOLLOTO12AB01804C6Deep Blue Sea (Daniel Rossen home recording)351.503222008Grizzly BearNaN85.0030.00.0[ 0.72449 3.55798 6.37712 9.20176 12.0...[ 0.72449 1.43405 2.1445 2.85228 3.5...4[1.8653000e-01 3.6881000e-01 5.4665000e-01 ......190.7606360.547244
444SOCNYGS12AB01832B8La vérité252.446892007Annie Blanchard0.0000113.2870.00.0[2.2334000e-01 2.3324800e+00 4.4484000e+00 6.5...[2.2334000e-01 7.5000000e-01 1.2775800e+00 1.8...4[2.2334000e-01 3.9890000e-01 5.7445000e-01 ......150.4797350.352460
+
+
+ +
+ +
+
+ +
+
+
+
In [6]:
+
+
+
nd=df[['song_ids','song_titles','artist_names']]
+nd.head()
+
+ +
+
+
+ +
+
+ + +
+ +
Out[6]:
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
song_idssong_titlesartist_names
0SONHTWP12A8C142744Vals '89Manolis Famellos & I Podilates
1SOPIHMB12AC468E0DDGhost of the Ocean (Live)Uriah Heep
2SODRPJT12AC468DEF1The frog songAlain-François
3SOLLOTO12AB01804C6Deep Blue Sea (Daniel Rossen home recording)Grizzly Bear
4SOCNYGS12AB01832B8La véritéAnnie Blanchard
+
+
+ +
+ +
+
+ +
+
+
+
In [7]:
+
+
+
nd['song_titles'].value_counts()
+
+ +
+
+
+ +
+
+ + +
+ +
Out[7]:
+ + + + +
+
Intro                             12
+Hey Joe                            5
+Smile                              5
+Wave                               4
+Outro                              4
+                                  ..
+In The Midst                       1
+Provisoirement                     1
+Chanson sous la pluie              1
+Tropical Nights                    1
+Jetstream - Arthur Baker Remix     1
+Name: song_titles, Length: 7438, dtype: int64
+
+ +
+ +
+
+ +
+
+
+
In [9]:
+
+
+
users = pd.read_table('./kaggle_visible_evaluation_triplets.txt', sep='\t', names= ['user_id','song_ids','play_count'])
+users.head()
+
+ +
+
+
+ +
+
+ + +
+ +
Out[9]:
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
user_idsong_idsplay_count
0fd50c4007b68a3737fe052d5a4f78ce8aa117f3dSOBONKR12A58A7A7E01
1fd50c4007b68a3737fe052d5a4f78ce8aa117f3dSOEGIYH12A6D4FC0E31
2fd50c4007b68a3737fe052d5a4f78ce8aa117f3dSOFLJQZ12A6D4FADA61
3fd50c4007b68a3737fe052d5a4f78ce8aa117f3dSOHTKMO12AB01843B01
4fd50c4007b68a3737fe052d5a4f78ce8aa117f3dSODQZCY12A6D4F9D111
+
+
+ +
+ +
+
+ +
+
+
+
In [10]:
+
+
+
uniqueUsers = users['user_id'].unique()
+len(uniqueUsers)
+
+ +
+
+
+ +
+
+ + +
+ +
Out[10]:
+ + + + +
+
110000
+
+ +
+ +
+
+ +
+
+
+
In [11]:
+
+
+
users['user_id'].nunique()
+
+ +
+
+
+ +
+
+ + +
+ +
Out[11]:
+ + + + +
+
110000
+
+ +
+ +
+
+ +
+
+
+
In [12]:
+
+
+
users["play_count"].describe()
+
+ +
+
+
+ +
+
+ + +
+ +
Out[12]:
+ + + + +
+
count    1.450933e+06
+mean     3.187149e+00
+std      7.051664e+00
+min      1.000000e+00
+25%      1.000000e+00
+50%      1.000000e+00
+75%      3.000000e+00
+max      9.230000e+02
+Name: play_count, dtype: float64
+
+ +
+ +
+
+ +
+
+
+
In [13]:
+
+
+
users["song_ids"].nunique()
+
+ +
+
+
+ +
+
+ + +
+ +
Out[13]:
+ + + + +
+
163206
+
+ +
+ +
+
+ +
+
+
+
In [14]:
+
+
+
knnData = pd.merge(users, nd)
+knnData
+
+ +
+
+
+ +
+
+ + +
+ +
Out[14]:
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
user_idsong_idsplay_countsong_titlesartist_names
0c34670d9c1718361feb93068a853cead3c95b76aSOEHWGF12A6D4F8B2B3Hips Don't Lie (featuring Wyclef Jean)Shakira Featuring Wyclef Jean
1c759e740af57c477fe358e62ad7b3b1f2f113a2fSOEHWGF12A6D4F8B2B6Hips Don't Lie (featuring Wyclef Jean)Shakira Featuring Wyclef Jean
28f6e833948caf895a3281ded74ceb32783916e42SOEHWGF12A6D4F8B2B1Hips Don't Lie (featuring Wyclef Jean)Shakira Featuring Wyclef Jean
38cd07652ccba3754502c8fa8fe809c418fdcdc8fSOEHWGF12A6D4F8B2B2Hips Don't Lie (featuring Wyclef Jean)Shakira Featuring Wyclef Jean
4563e8088cbb8affb096d2334531624a8cf7ff3d2SOEHWGF12A6D4F8B2B5Hips Don't Lie (featuring Wyclef Jean)Shakira Featuring Wyclef Jean
..................
18127a4a85f48a7d787b6e17ed38001abcd032cb87c6aSOKLIMD12A8C145AC31Whiskey on the FireAaron Watson
1812890bac2ccc1660cf444569f3553e6b141d132b2c3SONCEJF12AB018581C1JammingTwinkle Twinkle Little Rock Star
1812946a363f17bd4e07d2c607779877baedafc07e7d7SOKWNWI12A8C13383F1Bianca's Midnight LullabyAl Di Meola
181308ecfca10c16f046ae53634347d6b9029c40425c0SONQKDG12A8C130D961IsabelJuana Molina
18131e43d36faeb14c6982e3721a6503ba8978edb9384SOAWDBP12A8C144CB22Diamond In The RoughSyl Johnson
+

18132 rows × 5 columns

+
+
+ +
+ +
+
+ +
+
+
+
In [15]:
+
+
+
knnData["user_id"].nunique()
+
+ +
+
+
+ +
+
+ + +
+ +
Out[15]:
+ + + + +
+
16083
+
+ +
+ +
+
+ +
+
+
+
In [16]:
+
+
+
knnData["song_ids"].nunique()
+
+ +
+
+
+ +
+
+ + +
+ +
Out[16]:
+ + + + +
+
1311
+
+ +
+ +
+
+ +
+
+
+
In [17]:
+
+
+
knnData["play_count"].describe()
+
+ +
+
+
+ +
+
+ + +
+ +
Out[17]:
+ + + + +
+
count    18132.000000
+mean         2.999007
+std          7.307306
+min          1.000000
+25%          1.000000
+50%          1.000000
+75%          3.000000
+max        597.000000
+Name: play_count, dtype: float64
+
+ +
+ +
+
+ +
+
+
+
In [0]:
+
+
+
song=knnData.drop_duplicates(['user_id','song_titles','artist_names'])
+song=song.reset_index(drop=True)
+
+ +
+
+
+ +
+
+
+
In [19]:
+
+
+
song.head()
+
+ +
+
+
+ +
+
+ + +
+ +
Out[19]:
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
user_idsong_idsplay_countsong_titlesartist_names
0c34670d9c1718361feb93068a853cead3c95b76aSOEHWGF12A6D4F8B2B3Hips Don't Lie (featuring Wyclef Jean)Shakira Featuring Wyclef Jean
1c759e740af57c477fe358e62ad7b3b1f2f113a2fSOEHWGF12A6D4F8B2B6Hips Don't Lie (featuring Wyclef Jean)Shakira Featuring Wyclef Jean
28f6e833948caf895a3281ded74ceb32783916e42SOEHWGF12A6D4F8B2B1Hips Don't Lie (featuring Wyclef Jean)Shakira Featuring Wyclef Jean
38cd07652ccba3754502c8fa8fe809c418fdcdc8fSOEHWGF12A6D4F8B2B2Hips Don't Lie (featuring Wyclef Jean)Shakira Featuring Wyclef Jean
4563e8088cbb8affb096d2334531624a8cf7ff3d2SOEHWGF12A6D4F8B2B5Hips Don't Lie (featuring Wyclef Jean)Shakira Featuring Wyclef Jean
+
+
+ +
+ +
+
+ +
+
+
+
In [20]:
+
+
+
song_pivot=song.pivot(index='user_id',columns='song_ids',values='play_count')
+song_pivot=song_pivot.fillna(0)
+song_pivot.shape
+
+ +
+
+
+ +
+
+ + +
+ +
Out[20]:
+ + + + +
+
(16083, 1311)
+
+ +
+ +
+
+ +
+
+
+
In [21]:
+
+
+
song_pivot.head()
+
+ +
+
+
+ +
+
+ + +
+ +
Out[21]:
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
song_idsSOAAAQN12AB01856D3SOAAEHR12A6D4FB060SOAASSD12AB0181AA6SOABLAF12AB018E1D9SOABTKM12A8AE4721ESOABVWD12A58A7C3FFSOACEDS12A6701EAAASOACUIU12A6D4F715BSOADJND12A8C13BAE1SOAECHX12A6D4FC3D9SOAEEXM12A8C13D6E3SOAEGMV12A8C1455F2SOAEJTI12A8C145051SOAESFB12A8C13573FSOAFUPM12A6D4FD26FSOAGXBV12A6D4F70BDSOAGYNF12AB0187EEESOAHDOA12A6D4FA830SOAHRLX12A58A7C372SOAHYMX12AB0182021SOAIEMM12AB017EC98SOAIJKC12A8C131D6FSOAIOOJ12A8C1385D2SOAJEOO12A8C13A2FFSOAKDLX12A67ADAFC5SOAKODQ12A58A7B461SOAKPEL12A6D4FC126SOAMXYQ12AB017C25ESOANUME12A8C1368DFSOAOOXO12AF72A787FSOAOXTG12A67021AA7SOAPEEL12A81C21ADESOAPIHC12A6D4F5FD5SOAPLUZ12A6D4F9CD2SOAPQCG12AB017AAABSOAPZIG12A6D4F7920SOARSSE12A58A7BA9ASOASNQV12A8AE48819SOATHUP12A8C131DC3SOAUFFQ12A8C134623...SOZCURA12AF72A17B1SOZDDPQ12AF72A8BA8SOZEQVC12AC468E38BSOZFGOG12A58A7F755SOZFKKI12AB018602ASOZFZMX12AB018BE08SOZGQLE12AB018672CSOZGUEI12A8C139953SOZHSPI12A8C1339E6SOZIIHW12AB0189AFASOZIMLB12AF72AD1CDSOZKFHV12A6D4F996FSOZKYCJ12A6D4F480ASOZLSBK12A6D4F87B8SOZMELK12A8C143532SOZMHAO12A8C141C2ASOZMMFV12AB0183F74SOZNESJ12A6D4FD187SOZNQQQ12AF72ABF9FSOZPRDS12A8C134E2ESOZQDRV12A8C133FB1SOZQSGL12AF72A9145SOZQVTJ12A6701D96BSOZSHWZ12A8C1452B5SOZSKYN12A8C13A883SOZSSCO12AF72A554DSOZTOSX12AC468AD34SOZTUDR12A8C13FE3FSOZUEFV12A8C141169SOZUOAK12AB018AA82SOZVTZB12A58A7AEE4SOZVWSE12A6D4F7ADASOZVZWP12A58A7BAD1SOZWAMN12AB018234DSOZWECJ12A6D4F5229SOZXHBQ12AB0186626SOZYUKG12A6D4FB64FSOZZPYH12AB0187578SOZZQBH12A6D4FAFD8SOZZVMW12AB0183B52
user_id
00020fcd8b01986a6a85b896ccde6c49f35142ad0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
000724134199acaa98869fc4ffb805198d2940eb0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
0011d5f4fb02ff276763d385c3f2ded2b00ad94a0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
001a4329228373ec5d4efe1084317b4009df7b970.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
00200865ee578746cc29b28d2c14a81c74895a5f0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
+

5 rows × 1311 columns

+
+
+ +
+ +
+
+ +
+
+
+
In [0]:
+
+
+
from sklearn.neighbors import NearestNeighbors
+knn=NearestNeighbors(n_neighbors=10,metric='cosine')
+model_user=knn.fit(song_pivot)
+
+ +
+
+
+ +
+
+
+
In [0]:
+
+
+
# for i in range(0, len(distances.flatten())):
+#       if i == 0:
+#           print("Searching recommendation for user: ", song_pivot.index[query_index])
+#       else:
+#           rows = knnData.loc[knnData['user_id'] == song_pivot.index[indices.flatten()[i]] ]
+#           for item in rows.values:      
+#             print("\n  User: ", item[0])
+#             print("    Song: ", item[2])  
+#             print("    Play Count: ",  item[3])
+
+ +
+
+
+ +
+
+
+
In [0]:
+
+
+
def findRecomendationsUsers(model, matrix, data, query_index):
+  distances, indices = model.kneighbors([matrix.iloc[query_index, :]], n_neighbors = 10)
+  for i in range(0, len(distances.flatten())):
+        if i == 0:
+            print("Searching recommendation for user: ", matrix.index[query_index])
+        else:
+            rows = data.loc[data['user_id'] == matrix.index[indices.flatten()[i]] ]
+            for item in rows.values:      
+              print("\n  User: ", item[0])
+              print("    Play Count: ", item[2])  
+              print("    Song: ",  item[3])
+
+ +
+
+
+ +
+
+
+
In [27]:
+
+
+
query_index = np.random.choice(song_pivot.shape[0])
+query_index
+
+ +
+
+
+ +
+
+ + +
+ +
Out[27]:
+ + + + +
+
11973
+
+ +
+ +
+
+ +
+
+
+
In [0]:
+
+
+
# Some query index with unique recommendations
+# query_index = 1134
+# query_index 1277
+
+ +
+
+
+ +
+
+
+
In [29]:
+
+
+
findRecomendationsUsers(model_user, song_pivot, knnData, query_index)
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
Searching recommendation for user:  bcd2779b095b6da759ce245e262d5be5ece3a020
+
+  User:  8124ed9c91410c7cdd0eaeaa6c03e20858c16cbf
+    Play Count:  1
+    Song:  Dimension
+
+  User:  44efca4a32ec10570415ff27d750bcb7317a7537
+    Play Count:  1
+    Song:  Dimension
+
+  User:  cfa7f2cce2d8ec824d67708e0fc7506ab02d8fd2
+    Play Count:  2
+    Song:  Dimension
+
+  User:  b239d5d51be091b059a19c8715efc005f896c78c
+    Play Count:  1
+    Song:  Dimension
+
+  User:  0d50e72b0e312a574a99b94da96f7796740d7e6d
+    Play Count:  1
+    Song:  Dimension
+
+  User:  9e66bf7016204731edd27cdcf37a9168091a0326
+    Play Count:  1
+    Song:  Dimension
+
+  User:  18553a9964e4b7019f6ec873e7d4915bc4444c2f
+    Play Count:  1
+    Song:  Dimension
+
+  User:  440924f2c522a9c2539abaf58f24fff1d76723f1
+    Play Count:  1
+    Song:  Dimension
+
+  User:  93a0369cedca0b2ce753ba61d011d683b5ad85a1
+    Play Count:  1
+    Song:  Dimension
+
+
+
+ +
+
+ +
+
+
+
In [0]:
+
+
+
song_plays = (users.
+     groupby(by = ['song_ids'])['play_count'].
+     sum().
+     reset_index().
+     rename(columns = {'play_count': 'total_song_plays'})
+     [['song_ids', 'total_song_plays']]
+    )
+
+ +
+
+
+ +
+
+
+
In [31]:
+
+
+
song_plays.describe()
+
+ +
+
+
+ +
+
+ + +
+ +
Out[31]:
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
total_song_plays
count163206.000000
mean28.334375
std215.826789
min1.000000
25%1.000000
50%5.000000
75%15.000000
max35432.000000
+
+
+ +
+ +
+
+ +
+
+
+
+

Item Based Colaborative Filtering

+
+
+
+
+
+
In [0]:
+
+
+
from scipy.sparse import csr_matrix
+
+ +
+
+
+ +
+
+
+
In [0]:
+
+
+
sparse_matrix = song.pivot(index='song_ids',columns='user_id',values='play_count')
+sparse_matrix = sparse_matrix.fillna(0)
+
+ +
+
+
+ +
+
+
+
In [34]:
+
+
+
sparse_matrix
+
+ +
+
+
+ +
+
+ + +
+ +
Out[34]:
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
user_id00020fcd8b01986a6a85b896ccde6c49f35142ad000724134199acaa98869fc4ffb805198d2940eb0011d5f4fb02ff276763d385c3f2ded2b00ad94a001a4329228373ec5d4efe1084317b4009df7b9700200865ee578746cc29b28d2c14a81c74895a5f00209c99d83b405d47fe87f6761dbf7d259ca8560027bd60fea07d48fa336a979f9fa439bebb44fb0029b299091e9e9040761838785a0689a5f67215002ace7725512ef9180af3c8a0fbf0e1071b72d9003032fc00365d6f15f047c63717a14e0d8aced70032dddb264b47d623c93833a18007a7881024320034614d935784ee588b28dff22a4882a12cb40100365d3bf40b02ebd932bd43e7b463495a46ad6800387504e8fc8aa34827a637dea25000e86e85a30038d0eaac8e3e132e7199611a8add77815f3d860049335750252b238b7ed2d2018033c1ebd1e7ab00520d79b219630ec27d8d8b2a0399768528444000539b30daa6999e65cc44867acac6c336004a0200545af48096210f97930b66f6661df88729900f005aa4c4bc1dc74114b8bd6ffdca64c1d218474f005f71ae59d898709e7b88002c3be4d2d599a66f00629154d40c2100fb492508b4c535c661718da4006665569461ff1711a0f3f29c47b5e7ab43edb2006771ed630b23afa026256aa70ea4bbde3190970068bf86cce92b76b987c62578735c51b2bec607006a47b6c163573d750abcc50683f52448b59d760072963112236d305279a9fed2b195abd365a806007308634313ec6dcb20b55581d6e4ad1dcca8b700766ba637c5dbdb52ff0a5cbf13229e2135d0c2007835ec61401b07b4a61c3164556a7c5056ba2f007bf363856974d0bd57d3e4cdc93423769361f3007e450faa8daa47362a2a3f5d0a6f4ecd535f3f007f4e112f22e32bd1f3ef634afb30bf7262211a0086a41ed007814cb836ce8a541a92c68ab3c6880088bbf8870349910bc13612ac74384397d01f160088ee55a3c5834bce7e010af03680820bad5f1d0091d5d21c0f709d513d79bc17952e5ac0cc56a100949b7e0d675efa40992a0e3f66db26b7a27b08009d9c2babc0c05aa8a4419ad00f5105aa99c5e100a36168ed80334a6816e1feefd5b40aba212e31...ff5f55c48e94d0da039a0d40e03e2f254f5195bbff63ab995d2d5b87ced0f93dc3b4d13db02c2491ff65ec4a9765bcc63578aaea2eb68e502e462e2cff66c1e5c1fb424e06c761c95048c9ec4faa8070ff6bd57fa3d8860553ec778e24d73e775b280fc9ff6d36e7292335ea32e89b19d269a2d760a91a49ff6e96b1129b9f6330d0f1e59be39751e175ee4fff77fea5a8d84f5109de17185e2a7fb5d7e2a467ff7a04e8400800d26e522e436a088b1251a4cdf6ff80830a101547b5c112e72e939dde33f0a68a1bff814d959cc4b515fa7dccffb1355104791c60edff81bdc5042aabf6687b0322acc5803c2cb4d912ff85e05b8d2d01540cf41260df2532c4f16510d0ff8891b901eed1a3abc9bd4c53a17d2bcdc0ead7ff8a343fa2e3b0f61f3728dec69eae6ad137528dff8c7b25076f76e2ba5bfe62b094b95b50daa0edff8e0fe264adf90b61d2146b51f336abea8c6030ff93375e8105444419de44b55658d0dbe1c883d7ffa9ab7e3ff7b5d4fbac66bc9997949a9e721a91ffaa6d6870522d52107eb2cbbcfe7d1634400111ffbc11b17e88f2af9e7235630078d78d003f526affbfe37dc0f8454d4c7ad2061fb69287d1dc47f2ffc31c581692545c74b2508f46b83fac136f1a88ffc683d098d818421f22363b150a19fd7d307764ffd4cb97d77ee06adf29b0632350589404552b8effda55050d450037e24b67b8e0f48f4f16a03872ffdfb7f168ab6dc11c03a3af8684ff736aa06f04ffe0d010c60ef28ef5e6923e758f514e755adfcfffe33c42d3c85ad750326fa0ae45cc3b84d58f15ffe5a0afac73eefdc4e6cfb0a40df22480ed4ce2ffe5b8df7ba3210f4724fe8d9eeca0c435bcfab9ffe6cff4a35b9fa9bc77ce9f5c62803521293f0fffe70ee0afa3930edf9bca702cb3982d3ff747beffe98240b89fb05e1997ed4933b544d434f108b1ffec87ea10f29a7103edd660c45c65527b1c4b9dffee916020d891a74264b8326829742333b79103ffef5c05e4f25af2e8e9880af84d66936056b597fff24c114beca48744a1ca2b699dae8f42398ad1fff7e94f0a8d3c6c705b5f7c677d61da82aa545bfffcfe9b89b791e39ff3e643aa57ae9303079c56
song_ids
SOAAAQN12AB01856D30.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
SOAAEHR12A6D4FB0600.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
SOAASSD12AB0181AA60.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
SOABLAF12AB018E1D90.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
SOABTKM12A8AE4721E0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.01.00.00.00.00.00.00.00.00.00.0
......................................................................................................................................................................................................................................................
SOZXHBQ12AB01866260.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
SOZYUKG12A6D4FB64F0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
SOZZPYH12AB01875780.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
SOZZQBH12A6D4FAFD80.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
SOZZVMW12AB0183B520.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.00.0
+

1311 rows × 16083 columns

+
+
+ +
+ +
+
+ +
+
+
+
In [0]:
+
+
+
sparse_matrix_sparse = csr_matrix(sparse_matrix.values)
+
+ +
+
+
+ +
+
+
+
In [0]:
+
+
+
from sklearn.neighbors import NearestNeighbors
+knn=NearestNeighbors(n_neighbors=10,metric='cosine')
+knn_model=knn.fit(sparse_matrix_sparse)
+
+ +
+
+
+ +
+
+
+
In [0]:
+
+
+
# def findRecomendations(model, matrix, query_index):
+#   distances, indices = model.kneighbors([matrix.iloc[query_index, :]], n_neighbors = 10)
+#   for i in range(0, len(distances.flatten())):
+#       if i == 0:
+#           print(sparse_matrix.index[query_index], nd.loc[nd['song_ids'] == sparse_matrix.index[query_index]].song_titles.values[0])
+#       else:
+#           print(i, sparse_matrix.index[indices.flatten()[i]], nd.loc[nd['song_ids'] == sparse_matrix.index[indices.flatten()[i]] ].song_titles.values[0], distances.flatten()[i])
+
+ +
+
+
+ +
+
+
+
In [0]:
+
+
+
def findRecomendations(model, matrix, query_index):
+  distances, indices = model.kneighbors([matrix.iloc[query_index, :]], n_neighbors = 10)
+  for i in range(0, len(distances.flatten())):
+      if i == 0:
+          rowDetails = nd.loc[nd['song_ids'] == matrix.index[query_index]]
+          print("Song: ", rowDetails.song_titles.values[0], ", Artist: ",  rowDetails.artist_names.values[0] )
+      else:
+          rowDetails = nd.loc[nd['song_ids'] == matrix.index[indices.flatten()[i]] ]
+          print(" Recommendation", i, ": ")
+          print("   Song: ", rowDetails.song_titles.values[0])  
+          print("   Artist: ",  rowDetails.artist_names.values[0])
+          print("   Distance: ", distances.flatten()[i])
+
+ +
+
+
+ +
+
+
+
In [0]:
+
+
+
query_index = np.random.choice(sparse_matrix.shape[0])
+query_index
+query_index = 111
+
+ +
+
+
+ +
+
+
+
In [40]:
+
+
+
findRecomendations(knn_model, sparse_matrix, query_index)
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
Song:  Meet Me In The Bathroom , Artist:  The Strokes
+ Recommendation 1 : 
+   Song:  Between Love & Hate
+   Artist:  The Strokes
+   Distance:  0.7475532789460535
+ Recommendation 2 : 
+   Song:  Ahead By A Century
+   Artist:  The Tragically Hip
+   Distance:  0.9814504441695933
+ Recommendation 3 : 
+   Song:  Human Being
+   Artist:  The New York Dolls
+   Distance:  0.9836043541054011
+ Recommendation 4 : 
+   Song:  Dungeon Master
+   Artist:  EPMD / Nocturnal
+   Distance:  0.9848730148632904
+ Recommendation 5 : 
+   Song:  Brother
+   Artist:  Alice In Chains
+   Distance:  0.9891693927785223
+ Recommendation 6 : 
+   Song:  Welcome
+   Artist:  Phil Collins
+   Distance:  0.9974236728013324
+ Recommendation 7 : 
+   Song:  15 Step
+   Artist:  Radiohead
+   Distance:  0.9981707181046349
+ Recommendation 8 : 
+   Song:  Pero Me Acuerdo De Tí
+   Artist:  Christina Aguilera
+   Distance:  0.9989296116164493
+ Recommendation 9 : 
+   Song:  Don't Worry About It (Edited)
+   Artist:  N.E.R.D.
+   Distance:  1.0
+
+
+
+ +
+
+ +
+
+
+
In [0]:
+
+
+
distances, indices = knn_model.kneighbors([sparse_matrix.iloc[query_index, :]], n_neighbors = 6)
+
+ +
+
+
+ +
+
+
+
In [42]:
+
+
+
distances, indices 
+
+ +
+
+
+ +
+
+ + +
+ +
Out[42]:
+ + + + +
+
(array([[0.        , 0.74755328, 0.98145044, 0.98360435, 0.98487301,
+         0.98916939]]), array([[ 111, 1235,  689,  349,  425,  760]]))
+
+ +
+ +
+
+ +
+
+
+
In [43]:
+
+
+
for i in range(0, len(distances.flatten())):
+    if i == 0:
+        rowDetails = nd.loc[nd['song_ids'] == sparse_matrix.index[query_index]]
+        print("Song: ", rowDetails.song_titles.values[0], ", Artist: ",  rowDetails.artist_names.values[0] )
+    else:
+        rowDetails = nd.loc[nd['song_ids'] == sparse_matrix.index[indices.flatten()[i]] ]
+        print(" Recommendation", i, ": ")
+        print("   Song: ", rowDetails.song_titles.values[0])  
+        print("   Artist: ",  rowDetails.artist_names.values[0])
+        print("   Distance: ", distances.flatten()[i])
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
Song:  Meet Me In The Bathroom , Artist:  The Strokes
+ Recommendation 1 : 
+   Song:  Between Love & Hate
+   Artist:  The Strokes
+   Distance:  0.7475532789460535
+ Recommendation 2 : 
+   Song:  Ahead By A Century
+   Artist:  The Tragically Hip
+   Distance:  0.9814504441695933
+ Recommendation 3 : 
+   Song:  Human Being
+   Artist:  The New York Dolls
+   Distance:  0.9836043541054011
+ Recommendation 4 : 
+   Song:  Dungeon Master
+   Artist:  EPMD / Nocturnal
+   Distance:  0.9848730148632904
+ Recommendation 5 : 
+   Song:  Brother
+   Artist:  Alice In Chains
+   Distance:  0.9891693927785223
+
+
+
+ +
+
+ +
+
+
+
In [0]:
+
+
+
# nd
+
+ +
+
+
+ +
+
+
+
In [0]:
+
+
+
# nd['artist_names'].nunique()
+
+ +
+
+
+ +
+
+
+
In [0]:
+
+
+
# s = nd['song_ids']
+
+ +
+
+
+ +
+
+
+
In [0]:
+
+
+
# nd['song_ids'] == 'SOOSYMY12AB01888CD'
+
+ +
+
+
+ +
+
+
+
In [0]:
+
+
+
# print(nd.loc[nd['song_ids'] == 'SOOSYMY12AB01888CD', 'song_titles'].values[0])
+
+ +
+
+
+ +
+
+