diff --git a/jupyter/Collaborative Filtering.ipynb b/jupyter/Collaborative Filtering.ipynb index c6036e6..f3ee8e3 100755 --- a/jupyter/Collaborative Filtering.ipynb +++ b/jupyter/Collaborative Filtering.ipynb @@ -23,7 +23,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -33,7 +33,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -60,7 +60,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -75,14 +75,6 @@ " pandas.reset_option('display.max_rows')" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# DataStax Enterprise Analytics\n", - "" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -94,12 +86,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Connect to DSE Analytics Cluster" + "### Connect to Cassandra" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -118,20 +110,9 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "session.execute(\"\"\"\n", " CREATE KEYSPACE IF NOT EXISTS accelerate \n", @@ -149,7 +130,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -165,20 +146,9 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "query = \"CREATE TABLE IF NOT EXISTS jokes \\\n", " (userid int, jokeid int, rating float, \\\n", @@ -205,12 +175,12 @@ "* This is a file I created from the *.dat file and I only have 10,000 rows -- dataset has over 1 million rows\n", "\n", "\n", - "#### Insert all the Joke Rating Data into the DSE table `jokes`" + "#### Insert all the Joke Rating Data into the table `jokes`" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -235,27 +205,13 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": { "scrolled": true }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "100 5 -0.875\n", - "100 7 9.906000137329102\n", - "100 8 -0.843999981880188\n", - "100 13 8.937999725341797\n", - "100 15 -0.968999981880188\n", - "100 16 -9.75\n", - "100 17 9.593999862670898\n" - ] - } - ], - "source": [ - "query = 'SELECT * FROM jokes WHERE userid = 100'\n", + "outputs": [], + "source": [ + "query = 'SELECT * FROM jokes WHERE userid = 65'\n", "rows = session.execute(query)\n", "for row in rows:\n", " print (row.userid, row.jokeid, row.rating)" @@ -265,7 +221,6 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Machine Learning with DSE Analytics and Apache Spark\n", "" ] }, @@ -280,23 +235,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "#### Create a spark session that is connected to DSE. From there load each table into a Spark Dataframe and take a count of the number of rows in each." + "#### Create a spark session that is connected to Cassandra. From there load each table into a Spark Dataframe and take a count of the number of rows in each." ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Table Row Count: \n", - "10000\n" - ] - } - ], + "outputs": [], "source": [ "spark = SparkSession.builder.appName('demo').master(\"local\").getOrCreate()\n", "\n", @@ -306,22 +252,6 @@ "print (jokeTable.count())" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### CFilter with PySpark requires that the ratings not be double/foat but int" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "#joke_df = jokeTable.withColumn(\"rating\", jokeTable.rating.cast('int'))" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -331,118 +261,9 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": {}, - "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", - "
useridjokeidrating
0150
117-9
218-9
3113-6
41150
5117-9
6118-7
7119-8
8120-9
9121-7
\n", - "
" - ], - "text/plain": [ - " userid jokeid rating\n", - "0 1 5 0 \n", - "1 1 7 -9 \n", - "2 1 8 -9 \n", - "3 1 13 -6 \n", - "4 1 15 0 \n", - "5 1 17 -9 \n", - "6 1 18 -7 \n", - "7 1 19 -8 \n", - "8 1 20 -9 \n", - "9 1 21 -7 " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "(training, test) = jokeTable.randomSplit([0.8, 0.2])\n", "\n", @@ -463,7 +284,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -475,119 +296,9 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "metadata": {}, - "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", - "
useridrecommendations
0148[(44, 34.13772964477539), (51, 25.700042724609375), (125, 24.875423431396484), (146, 24.236581802368164), (69, 23.100719451904297), (143, 23.069561004638672), (119, 22.743892669677734), (65, 21.494281768798828), (138, 20.9459228515625), (26, 20.843549728393555)]
1243[(98, 16.153411865234375), (79, 15.212631225585938), (101, 13.930389404296875), (57, 12.906051635742188), (58, 12.793245315551758), (24, 9.772829055786133), (85, 9.358484268188477), (13, 8.649678230285645), (23, 7.858341693878174), (37, 7.614729404449463)]
2251[(55, 4.414163112640381), (52, 4.053103446960449), (124, 3.2235026359558105), (133, 1.8868601322174072), (141, 1.1414566040039062), (120, 0.8265798687934875), (122, 0.6061234474182129), (44, 0.4783670902252197), (114, 0.1717315912246704), (82, -0.7522410750389099)]
385[(40, 93.38774108886719), (48, 70.61991882324219), (90, 61.215755462646484), (86, 56.27168655395508), (114, 55.27031326293945), (43, 53.20564651489258), (60, 47.55717468261719), (100, 42.91171646118164), (33, 42.73453140258789), (104, 42.418277740478516)]
4137[(37, 11.013225555419922), (100, 9.195761680603027), (15, 9.175329208374023), (7, 8.999856948852539), (8, 8.987367630004883), (17, 8.032954216003418), (78, 7.779767036437988), (20, 7.432913780212402), (57, 7.157354354858398), (13, 7.101101875305176)]
565[(94, 13.413860321044922), (82, 11.760915756225586), (80, 11.44350528717041), (116, 11.285964012145996), (63, 11.251116752624512), (26, 11.184839248657227), (99, 11.051153182983398), (43, 10.730409622192383), (75, 10.707722663879395), (92, 10.706671714782715)]
653[(114, 13.702998161315918), (116, 13.296106338500977), (117, 12.910265922546387), (80, 11.056073188781738), (105, 9.647844314575195), (148, 9.136292457580566), (91, 8.573720932006836), (60, 8.479909896850586), (55, 8.326761245727539), (52, 8.317741394042969)]
7133[(35, 8.389063835144043), (94, 8.131109237670898), (32, 8.074833869934082), (121, 7.820661544799805), (53, 7.75675106048584), (89, 7.586538314819336), (119, 6.810390949249268), (46, 6.713859558105469), (69, 6.705226421356201), (81, 6.654937744140625)]
8155[(46, 43.723426818847656), (35, 38.590579986572266), (119, 37.78889846801758), (53, 37.23609161376953), (26, 36.63851547241211), (69, 36.21256637573242), (34, 35.53752899169922), (21, 34.712867736816406), (32, 33.222694396972656), (125, 31.87568473815918)]
9108[(75, 37.769920349121094), (40, 33.574073791503906), (102, 28.94316864013672), (114, 26.217697143554688), (43, 25.416234970092773), (124, 25.390714645385742), (100, 24.526344299316406), (48, 24.486526489257812), (81, 23.37546157836914), (86, 23.240493774414062)]
\n", - "
" - ], - "text/plain": [ - " userid \\\n", - "0 148 \n", - "1 243 \n", - "2 251 \n", - "3 85 \n", - "4 137 \n", - "5 65 \n", - "6 53 \n", - "7 133 \n", - "8 155 \n", - "9 108 \n", - "\n", - " recommendations \n", - "0 [(44, 34.13772964477539), (51, 25.700042724609375), (125, 24.875423431396484), (146, 24.236581802368164), (69, 23.100719451904297), (143, 23.069561004638672), (119, 22.743892669677734), (65, 21.494281768798828), (138, 20.9459228515625), (26, 20.843549728393555)] \n", - "1 [(98, 16.153411865234375), (79, 15.212631225585938), (101, 13.930389404296875), (57, 12.906051635742188), (58, 12.793245315551758), (24, 9.772829055786133), (85, 9.358484268188477), (13, 8.649678230285645), (23, 7.858341693878174), (37, 7.614729404449463)] \n", - "2 [(55, 4.414163112640381), (52, 4.053103446960449), (124, 3.2235026359558105), (133, 1.8868601322174072), (141, 1.1414566040039062), (120, 0.8265798687934875), (122, 0.6061234474182129), (44, 0.4783670902252197), (114, 0.1717315912246704), (82, -0.7522410750389099)] \n", - "3 [(40, 93.38774108886719), (48, 70.61991882324219), (90, 61.215755462646484), (86, 56.27168655395508), (114, 55.27031326293945), (43, 53.20564651489258), (60, 47.55717468261719), (100, 42.91171646118164), (33, 42.73453140258789), (104, 42.418277740478516)] \n", - "4 [(37, 11.013225555419922), (100, 9.195761680603027), (15, 9.175329208374023), (7, 8.999856948852539), (8, 8.987367630004883), (17, 8.032954216003418), (78, 7.779767036437988), (20, 7.432913780212402), (57, 7.157354354858398), (13, 7.101101875305176)] \n", - "5 [(94, 13.413860321044922), (82, 11.760915756225586), (80, 11.44350528717041), (116, 11.285964012145996), (63, 11.251116752624512), (26, 11.184839248657227), (99, 11.051153182983398), (43, 10.730409622192383), (75, 10.707722663879395), (92, 10.706671714782715)] \n", - "6 [(114, 13.702998161315918), (116, 13.296106338500977), (117, 12.910265922546387), (80, 11.056073188781738), (105, 9.647844314575195), (148, 9.136292457580566), (91, 8.573720932006836), (60, 8.479909896850586), (55, 8.326761245727539), (52, 8.317741394042969)] \n", - "7 [(35, 8.389063835144043), (94, 8.131109237670898), (32, 8.074833869934082), (121, 7.820661544799805), (53, 7.75675106048584), (89, 7.586538314819336), (119, 6.810390949249268), (46, 6.713859558105469), (69, 6.705226421356201), (81, 6.654937744140625)] \n", - "8 [(46, 43.723426818847656), (35, 38.590579986572266), (119, 37.78889846801758), (53, 37.23609161376953), (26, 36.63851547241211), (69, 36.21256637573242), (34, 35.53752899169922), (21, 34.712867736816406), (32, 33.222694396972656), (125, 31.87568473815918)] \n", - "9 [(75, 37.769920349121094), (40, 33.574073791503906), (102, 28.94316864013672), (114, 26.217697143554688), (43, 25.416234970092773), (124, 25.390714645385742), (100, 24.526344299316406), (48, 24.486526489257812), (81, 23.37546157836914), (86, 23.240493774414062)] " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# Evaluate the model by computing the RMSE on the test data\n", "predictions = model.transform(testing_df)\n", @@ -603,141 +314,30 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
useridrecommendations
065[(94, 13.413860321044922), (82, 11.760915756225586), (80, 11.44350528717041), (116, 11.285964012145996), (63, 11.251116752624512), (26, 11.184839248657227), (99, 11.051153182983398), (43, 10.730409622192383), (75, 10.707722663879395), (92, 10.706671714782715)]
\n", - "
" - ], - "text/plain": [ - " userid \\\n", - "0 65 \n", - "\n", - " recommendations \n", - "0 [(94, 13.413860321044922), (82, 11.760915756225586), (80, 11.44350528717041), (116, 11.285964012145996), (63, 11.251116752624512), (26, 11.184839248657227), (99, 11.051153182983398), (43, 10.730409622192383), (75, 10.707722663879395), (92, 10.706671714782715)] " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "showDF(userRecs.filter(userRecs.userid == 65))" ] }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " " - ], - "text/plain": [ - "" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "IFrame(src='images/init94.html', width=700, height=200)" ] }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " " - ], - "text/plain": [ - "" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "IFrame(src='images/init43.html', width=700, height=200)" ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "session.execute(\"\"\"drop table jokes\"\"\")" - ] } ], "metadata": { @@ -756,7 +356,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.0" + "version": "3.7.3" } }, "nbformat": 4, diff --git a/jupyter/FP-Growth.ipynb b/jupyter/FP-Growth.ipynb index b6bd61f..0a18b11 100755 --- a/jupyter/FP-Growth.ipynb +++ b/jupyter/FP-Growth.ipynb @@ -23,7 +23,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -33,7 +33,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -56,7 +56,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -89,20 +89,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Connect to DSE Analytics Cluster" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# DataStax Enterprise Analytics\n", "" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -121,20 +113,9 @@ }, { "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "session.execute(\"\"\"\n", " CREATE KEYSPACE IF NOT EXISTS accelerate \n", @@ -151,7 +132,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -167,20 +148,9 @@ }, { "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "query = \"CREATE TABLE IF NOT EXISTS movies \\\n", " (movieid int, title text, genres text, \\\n", @@ -197,20 +167,9 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "query = \"CREATE TABLE IF NOT EXISTS movieratings \\\n", " (userid int, movieid int, rating float, timestamp text, \\\n", @@ -252,12 +211,12 @@ "### Load Movie datasets from CSV file (rating_movies.csv, movies.csv)\n", "* No clean up was requried! How nice :)\n", "\n", - "#### Insert all the Movie Data into the DSE table `movies` and `movieratings`" + "#### Insert all the Movie Data into the table `movies` and `movieratings`" ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -274,7 +233,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -293,7 +252,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Machine Learning with DSE Analytics and Apache Spark\n", + "## Machine Learning with Apache Spark\n", "" ] }, @@ -301,23 +260,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "#### Create a spark session that is connected to DSE. From there load each table into a Spark Dataframe and take a count of the number of rows in each." + "#### Create a spark session that is connected to cassandra. From there load each table into a Spark Dataframe and take a count of the number of rows in each." ] }, { "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Table Row Count: \n", - "100000\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "spark = SparkSession.builder.appName('demo').master(\"local\").getOrCreate()\n", "\n", @@ -329,89 +279,9 @@ }, { "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "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", - "
useridmovieidratingtimestamp
02314.012/24/98 0:13\\n
123254.012/24/98 0:07\\n
223325.012/24/98 0:12\\n
323475.012/24/98 0:06\\n
423505.012/24/98 0:02\\n
\n", - "
" - ], - "text/plain": [ - " userid movieid rating timestamp\n", - "0 23 1 4.0 12/24/98 0:13\\n\n", - "1 23 25 4.0 12/24/98 0:07\\n\n", - "2 23 32 5.0 12/24/98 0:12\\n\n", - "3 23 47 5.0 12/24/98 0:06\\n\n", - "4 23 50 5.0 12/24/98 0:02\\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "showDF(movieDF)" ] @@ -432,83 +302,9 @@ }, { "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "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", - "
useridmovieidrating
02314.0
123254.0
223325.0
323475.0
423505.0
\n", - "
" - ], - "text/plain": [ - " userid movieid rating\n", - "0 23 1 4.0\n", - "1 23 25 4.0\n", - "2 23 32 5.0\n", - "3 23 47 5.0\n", - "4 23 50 5.0" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "newMovieDF = movieDF.drop('timestamp')\n", "showDF(newMovieDF)" @@ -523,83 +319,9 @@ }, { "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "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", - "
useridmovieidrating
02314.0
123254.0
223325.0
323475.0
423505.0
\n", - "
" - ], - "text/plain": [ - " userid movieid rating\n", - "0 23 1 4.0\n", - "1 23 25 4.0\n", - "2 23 32 5.0\n", - "3 23 47 5.0\n", - "4 23 50 5.0" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "newestMovies = newMovieDF.filter(\"rating > 3\")\n", "showDF(newestMovies)" @@ -614,42 +336,9 @@ }, { "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+------+--------------------+\n", - "|userid| moviesRated|\n", - "+------+--------------------+\n", - "| 463|[161, 509, 590, 2...|\n", - "| 148|[356, 4995, 539, ...|\n", - "| 471|[508, 356, 4008, ...|\n", - "| 496|[356, 1953, 1395,...|\n", - "| 623|[356, 165, 593, 5...|\n", - "| 243|[592, 356, 153, 1...|\n", - "| 392|[3254, 596, 4995,...|\n", - "| 540|[356, 70286, 5874...|\n", - "| 31|[54997, 45517, 70...|\n", - "| 516|[356, 785, 1345, ...|\n", - "| 137|[356, 3173, 1222,...|\n", - "| 251|[466, 356, 110, 3...|\n", - "| 85|[945, 916, 1293, ...|\n", - "| 580|[4306, 4973, 1223...|\n", - "| 451|[6440, 1222, 714,...|\n", - "| 458|[299, 2396, 3798,...|\n", - "| 65|[356, 40870, 7609...|\n", - "| 53|[1953, 1649, 1172...|\n", - "| 255|[2, 2006, 380, 20...|\n", - "| 588|[4995, 4343, 3450...|\n", - "+------+--------------------+\n", - "only showing top 20 rows\n", - "\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "group_user = newestMovies.groupBy('userid').agg(collect_set('movieid').alias('moviesRated'))\n", "group_user.show()\n" @@ -664,77 +353,9 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "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", - "
useriditems
0463[161, 509, 590, 277, 105, 410, 207, 25, 381, 5...
1148[356, 4995, 539, 916, 2340, 4285, 1680, 4062, ...
2471[508, 356, 4008, 1272, 8982, 3450, 2078, 2028,...
3496[356, 1953, 1395, 1476, 1222, 3421, 2028, 1266...
4623[356, 165, 593, 590, 318, 292, 50, 296, 380, 3...
\n", - "
" - ], - "text/plain": [ - " userid items\n", - "0 463 [161, 509, 590, 277, 105, 410, 207, 25, 381, 5...\n", - "1 148 [356, 4995, 539, 916, 2340, 4285, 1680, 4062, ...\n", - "2 471 [508, 356, 4008, 1272, 8982, 3450, 2078, 2028,...\n", - "3 496 [356, 1953, 1395, 1476, 1222, 3421, 2028, 1266...\n", - "4 623 [356, 165, 593, 590, 318, 292, 50, 296, 380, 3..." - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "df = group_user.withColumnRenamed(\"moviesRated\", \"items\")\n", "showDF(df)" @@ -742,20 +363,9 @@ }, { "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "702" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "df.select('userid').distinct().count()" ] @@ -772,42 +382,9 @@ }, { "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+------+--------------------+--------------------+\n", - "|userid| items| prediction|\n", - "+------+--------------------+--------------------+\n", - "| 463|[161, 509, 590, 2...|[50, 356, 2858, 2...|\n", - "| 148|[356, 4995, 539, ...|[4993, 2959, 296,...|\n", - "| 471|[508, 356, 4008, ...|[296, 589, 2858, ...|\n", - "| 496|[356, 1953, 1395,...|[318, 593, 296, 2...|\n", - "| 623|[356, 165, 593, 5...|[2858, 47, 260, 5...|\n", - "| 243|[592, 356, 153, 1...|[593, 260, 527, 2...|\n", - "| 392|[3254, 596, 4995,...|[356, 527, 260, 5...|\n", - "| 540|[356, 70286, 5874...|[593, 318, 589, 4...|\n", - "| 31|[54997, 45517, 70...|[356, 527, 296, 5...|\n", - "| 516|[356, 785, 1345, ...|[318, 593, 2858, ...|\n", - "| 137|[356, 3173, 1222,...|[50, 47, 5952, 49...|\n", - "| 251|[466, 356, 110, 3...|[318, 593, 457, 2...|\n", - "| 85|[945, 916, 1293, ...|[2959, 296, 2571,...|\n", - "| 580|[4306, 4973, 1223...|[318, 356, 593, 5...|\n", - "| 451|[6440, 1222, 714,...|[1198, 260, 1196,...|\n", - "| 458|[299, 2396, 3798,...|[50, 296, 858, 60...|\n", - "| 65|[356, 40870, 7609...|[1198, 260, 296, ...|\n", - "| 53|[1953, 1649, 1172...|[296, 318, 593, 2...|\n", - "| 255|[2, 2006, 380, 20...|[150, 356, 457, 5...|\n", - "| 588|[4995, 4343, 3450...|[50, 296, 1221, 2...|\n", - "+------+--------------------+--------------------+\n", - "only showing top 20 rows\n", - "\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "fpGrowth = FPGrowth(itemsCol=\"items\", minSupport=0.1, minConfidence=0.2)\n", "model = fpGrowth.fit(df)\n", @@ -824,42 +401,9 @@ }, { "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+------------+----------+------------------+------------------+\n", - "| antecedent|consequent| confidence| lift|\n", - "+------------+----------+------------------+------------------+\n", - "| [608, 593]| [296]|0.8301886792452831| 2.111566858080394|\n", - "| [608, 593]| [318]|0.7075471698113207| 1.793133982698726|\n", - "|[7153, 2959]| [4993]| 0.935064935064935| 4.405473720909962|\n", - "| [541]| [1198]|0.5658914728682171|2.2069767441860466|\n", - "| [541]| [260]|0.6124031007751938| 2.01834261382247|\n", - "| [541]| [296]|0.6744186046511628|1.7153690596562183|\n", - "| [541]| [593]|0.5581395348837209|1.6124031007751938|\n", - "| [541]| [1196]|0.5968992248062015| 2.289744567289363|\n", - "| [541]| [2571]|0.6589147286821705|2.1922186707814393|\n", - "| [527, 593]| [356]|0.6428571428571429|1.6714285714285715|\n", - "| [527, 593]| [296]|0.7053571428571429|1.7940605590062113|\n", - "| [527, 593]| [318]|0.7142857142857143|1.8102114492006187|\n", - "| [2028, 296]| [2858]| 0.782608695652174|2.7197589324149805|\n", - "| [1196, 296]| [260]|0.8061224489795918|2.6567979304397817|\n", - "| [480, 593]| [356]|0.7916666666666666| 2.058333333333333|\n", - "| [858, 50]| [296]|0.8064516129032258|2.0511921458625526|\n", - "| [858, 50]| [318]|0.7741935483870968| 1.962035635262606|\n", - "| [1221, 296]| [858]| 0.961038961038961|3.8332349468713103|\n", - "|[4226, 2959]| [4993]|0.6574074074074074| 3.097315436241611|\n", - "|[4226, 2959]| [2858]|0.7129629629629629|2.4777227722772275|\n", - "+------------+----------+------------------+------------------+\n", - "only showing top 20 rows\n", - "\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# Display frequent itemsets.\n", "#model.freqItemsets.show()\n", @@ -872,20 +416,9 @@ }, { "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "If you like these movies: \n", - "[[608, 593]]\n", - "Then you will like this movie:\n", - "[[296]]\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(\"If you like these movies: \")\n", "print(list(dfAssociation.select('antecedent').first()))\n", @@ -900,25 +433,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "#### Query DSE to get movie titles" + "#### Query database to get movie titles" ] }, { "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Fargo (1996)\n", - "\n", - "\"Silence of the Lambs\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "query = \"select title from movies WHERE movieid=\"\n", "query = query + str(movieYoulike[0][0])\n", @@ -948,18 +470,9 @@ }, { "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Pulp Fiction (1994)\n" - ] - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "query = \"select title from movies WHERE movieid=\"\n", "query = query + str(movieToRecommend[0][0])\n", diff --git a/jupyter/Naivebayes.ipynb b/jupyter/Naivebayes.ipynb index 4d01b8c..226e5de 100755 --- a/jupyter/Naivebayes.ipynb +++ b/jupyter/Naivebayes.ipynb @@ -23,7 +23,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -33,7 +33,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -63,7 +63,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -82,7 +82,6 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# DataStax Enterprise Analytics\n", "" ] }, @@ -97,12 +96,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Connect to DSE Analytics Cluster" + "### Connect to Cassandra" ] }, { "cell_type": "code", - "execution_count": 23, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -121,20 +120,11 @@ }, { "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], "source": [ "session.execute(\"\"\"\n", " CREATE KEYSPACE IF NOT EXISTS accelerate \n", @@ -152,7 +142,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -168,20 +158,9 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "query = \"CREATE TABLE IF NOT EXISTS wines \\\n", " (wineid int, fixedAcidity float, volatileAcidity float, citricAcid float, sugar float, \\\n", @@ -231,7 +210,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -269,7 +248,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Machine Learning with DSE Analytics and Apache Spark\n", + "## Machine Learning with Apache Cassandra & Apache Spark\n", "" ] }, @@ -277,23 +256,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "#### Create a spark session that is connected to DSE. From there load each table into a Spark Dataframe and take a count of the number of rows in each." + "#### Create a spark session that is connected to the database. From there load each table into a Spark Dataframe and take a count of the number of rows in each." ] }, { "cell_type": "code", - "execution_count": 29, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Table Wine Row Count: \n", - "6497\n" - ] - } - ], + "outputs": [], "source": [ "spark = SparkSession.builder.appName('demo').master(\"local\").getOrCreate()\n", "\n", @@ -305,150 +275,9 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": null, "metadata": {}, - "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", - "
wineidalcoholchloridescitricaciddensityfixedacidityfreesulfurphqualitysugarsulphatestotalsulfurvolatileacidity
0431710.80.0460.290.995186.859.03.206.010.40.40143.00.16
1337210.90.0590.260.995507.832.03.046.09.50.43178.00.40
215849.80.0740.290.995786.232.03.335.02.10.6298.00.46
348309.40.0560.570.995486.760.02.966.06.60.43150.00.13
427319.70.0470.340.994406.924.03.206.04.00.52128.00.23
\n", - "
" - ], - "text/plain": [ - " wineid alcohol chlorides citricacid density fixedacidity freesulfur \\\n", - "0 4317 10.8 0.046 0.29 0.99518 6.8 59.0 \n", - "1 3372 10.9 0.059 0.26 0.99550 7.8 32.0 \n", - "2 1584 9.8 0.074 0.29 0.99578 6.2 32.0 \n", - "3 4830 9.4 0.056 0.57 0.99548 6.7 60.0 \n", - "4 2731 9.7 0.047 0.34 0.99440 6.9 24.0 \n", - "\n", - " ph quality sugar sulphates totalsulfur volatileacidity \n", - "0 3.20 6.0 10.4 0.40 143.0 0.16 \n", - "1 3.04 6.0 9.5 0.43 178.0 0.40 \n", - "2 3.33 5.0 2.1 0.62 98.0 0.46 \n", - "3 2.96 6.0 6.6 0.43 150.0 0.13 \n", - "4 3.20 6.0 4.0 0.52 128.0 0.23 " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "showDF(wineDF)" ] @@ -462,150 +291,9 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": null, "metadata": {}, - "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", - "
wineidalcoholchloridescitricaciddensityfixedacidityfreesulfurphqualitysugarsulphatestotalsulfurvolatileacidity
0431710.80.0460.290.995186.859.03.206.010.40.40143.00.16
1337210.90.0590.260.995507.832.03.046.09.50.43178.00.40
248309.40.0560.570.995486.760.02.966.06.60.43150.00.13
327319.70.0470.340.994406.924.03.206.04.00.52128.00.23
47699.70.0820.020.997447.124.03.556.02.30.5394.00.59
\n", - "
" - ], - "text/plain": [ - " wineid alcohol chlorides citricacid density fixedacidity freesulfur \\\n", - "0 4317 10.8 0.046 0.29 0.99518 6.8 59.0 \n", - "1 3372 10.9 0.059 0.26 0.99550 7.8 32.0 \n", - "2 4830 9.4 0.056 0.57 0.99548 6.7 60.0 \n", - "3 2731 9.7 0.047 0.34 0.99440 6.9 24.0 \n", - "4 769 9.7 0.082 0.02 0.99744 7.1 24.0 \n", - "\n", - " ph quality sugar sulphates totalsulfur volatileacidity \n", - "0 3.20 6.0 10.4 0.40 143.0 0.16 \n", - "1 3.04 6.0 9.5 0.43 178.0 0.40 \n", - "2 2.96 6.0 6.6 0.43 150.0 0.13 \n", - "3 3.20 6.0 4.0 0.52 128.0 0.23 \n", - "4 3.55 6.0 2.3 0.53 94.0 0.59 " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "wine6DF = wineDF.filter(\"quality > 5\")\n", "showDF(wine6DF)" @@ -620,176 +308,9 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": null, "metadata": {}, - "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", - "
wineidalcoholchloridescitricaciddensityfixedacidityfreesulfurphqualitysugarsulphatestotalsulfurvolatileacidityfeatureslabel
0431710.80.0460.290.995186.859.03.206.010.40.40143.00.16[10.800000190734863, 0.04600000008940697, 0.28...0.0
1337210.90.0590.260.995507.832.03.046.09.50.43178.00.40[10.899999618530273, 0.05900000035762787, 0.25...0.0
248309.40.0560.570.995486.760.02.966.06.60.43150.00.13[9.399999618530273, 0.0560000017285347, 0.5699...0.0
327319.70.0470.340.994406.924.03.206.04.00.52128.00.23[9.699999809265137, 0.04699999839067459, 0.340...0.0
47699.70.0820.020.997447.124.03.556.02.30.5394.00.59[9.699999809265137, 0.0820000022649765, 0.0199...0.0
\n", - "
" - ], - "text/plain": [ - " wineid alcohol chlorides citricacid density fixedacidity freesulfur \\\n", - "0 4317 10.8 0.046 0.29 0.99518 6.8 59.0 \n", - "1 3372 10.9 0.059 0.26 0.99550 7.8 32.0 \n", - "2 4830 9.4 0.056 0.57 0.99548 6.7 60.0 \n", - "3 2731 9.7 0.047 0.34 0.99440 6.9 24.0 \n", - "4 769 9.7 0.082 0.02 0.99744 7.1 24.0 \n", - "\n", - " ph quality sugar sulphates totalsulfur volatileacidity \\\n", - "0 3.20 6.0 10.4 0.40 143.0 0.16 \n", - "1 3.04 6.0 9.5 0.43 178.0 0.40 \n", - "2 2.96 6.0 6.6 0.43 150.0 0.13 \n", - "3 3.20 6.0 4.0 0.52 128.0 0.23 \n", - "4 3.55 6.0 2.3 0.53 94.0 0.59 \n", - "\n", - " features label \n", - "0 [10.800000190734863, 0.04600000008940697, 0.28... 0.0 \n", - "1 [10.899999618530273, 0.05900000035762787, 0.25... 0.0 \n", - "2 [9.399999618530273, 0.0560000017285347, 0.5699... 0.0 \n", - "3 [9.699999809265137, 0.04699999839067459, 0.340... 0.0 \n", - "4 [9.699999809265137, 0.0820000022649765, 0.0199... 0.0 " - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "4113\n" - ] - } - ], + "outputs": [], "source": [ "assembler = VectorAssembler(\n", " inputCols=['alcohol', 'chlorides', 'citricacid', 'density', 'fixedacidity', 'ph', 'freesulfur', 'sugar', 'sulphates', 'totalsulfur', 'volatileacidity'],\n", @@ -808,25 +329,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### We will be training a model with Naive Bays, and because of this we need to split up our dataset in to a training and test set. Will split 80/20. " + "We need to split up our dataset in to a training and test set. Will split 80/20. " ] }, { "cell_type": "code", - "execution_count": 33, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Train Dataframe Row Count: \n", - "3366\n", - "Test Dataframe Row Count: \n", - "747\n" - ] - } - ], + "outputs": [], "source": [ "# Split the data into train and test\n", "splits = trainingData1.randomSplit([0.8, 0.2], 1234)\n", @@ -849,208 +359,9 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "747\n" - ] - }, - { - "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", - "
wineidalcoholchloridescitricaciddensityfixedacidityfreesulfurphqualitysugarsulphatestotalsulfurvolatileacidityfeatureslabelrawPredictionprobabilityprediction
0810.00.0650.000.99467.315.03.397.01.20.4721.00.650[10.0, 0.06499999761581421, 0.0, 0.99459999799...1.0[-116.61332062455122, -116.11569707646935, -11...[0.3624807686165096, 0.5962112012919782, 0.038...1.0
1309.80.0820.000.99647.88.03.386.02.00.5916.00.645[9.800000190734863, 0.0820000022649765, 0.0, 0...0.0[-107.00826876792438, -106.69331316801713, -10...[0.4109511317563823, 0.5630846130734202, 0.023...1.0
24310.50.3320.200.99687.58.03.216.02.60.9014.00.490[10.5, 0.3319999873638153, 0.20000000298023224...0.0[-112.66442184314677, -112.30188509993125, -11...[0.3992810255077367, 0.5737548627763441, 0.022...1.0
312910.50.0650.160.99628.03.03.427.01.80.9216.00.590[10.5, 0.06499999761581421, 0.1599999964237213...1.0[-102.8833290398864, -102.54742453805858, -106...[0.40916428022145745, 0.5725048690933248, 0.01...1.0
42219.40.0820.370.99647.824.03.346.02.00.5958.00.340[9.399999618530273, 0.0820000022649765, 0.3700...0.0[-151.32966193268658, -151.34435617974762, -15...[0.4777992886623408, 0.47082971956014313, 0.04...0.0
\n", - "
" - ], - "text/plain": [ - " wineid alcohol chlorides citricacid density fixedacidity freesulfur \\\n", - "0 8 10.0 0.065 0.00 0.9946 7.3 15.0 \n", - "1 30 9.8 0.082 0.00 0.9964 7.8 8.0 \n", - "2 43 10.5 0.332 0.20 0.9968 7.5 8.0 \n", - "3 129 10.5 0.065 0.16 0.9962 8.0 3.0 \n", - "4 221 9.4 0.082 0.37 0.9964 7.8 24.0 \n", - "\n", - " ph quality sugar sulphates totalsulfur volatileacidity \\\n", - "0 3.39 7.0 1.2 0.47 21.0 0.650 \n", - "1 3.38 6.0 2.0 0.59 16.0 0.645 \n", - "2 3.21 6.0 2.6 0.90 14.0 0.490 \n", - "3 3.42 7.0 1.8 0.92 16.0 0.590 \n", - "4 3.34 6.0 2.0 0.59 58.0 0.340 \n", - "\n", - " features label \\\n", - "0 [10.0, 0.06499999761581421, 0.0, 0.99459999799... 1.0 \n", - "1 [9.800000190734863, 0.0820000022649765, 0.0, 0... 0.0 \n", - "2 [10.5, 0.3319999873638153, 0.20000000298023224... 0.0 \n", - "3 [10.5, 0.06499999761581421, 0.1599999964237213... 1.0 \n", - "4 [9.399999618530273, 0.0820000022649765, 0.3700... 0.0 \n", - "\n", - " rawPrediction \\\n", - "0 [-116.61332062455122, -116.11569707646935, -11... \n", - "1 [-107.00826876792438, -106.69331316801713, -10... \n", - "2 [-112.66442184314677, -112.30188509993125, -11... \n", - "3 [-102.8833290398864, -102.54742453805858, -106... \n", - "4 [-151.32966193268658, -151.34435617974762, -15... \n", - "\n", - " probability prediction \n", - "0 [0.3624807686165096, 0.5962112012919782, 0.038... 1.0 \n", - "1 [0.4109511317563823, 0.5630846130734202, 0.023... 1.0 \n", - "2 [0.3992810255077367, 0.5737548627763441, 0.022... 1.0 \n", - "3 [0.40916428022145745, 0.5725048690933248, 0.01... 1.0 \n", - "4 [0.4777992886623408, 0.47082971956014313, 0.04... 0.0 " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "nb = NaiveBayes(smoothing=1.0, modelType=\"multinomial\")\n", "\n", @@ -1065,96 +376,9 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": null, "metadata": {}, - "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", - "
qualitylabelpredictionprobability
07.01.01.0[0.3624807686165096, 0.5962112012919782, 0.038...
16.00.01.0[0.4109511317563823, 0.5630846130734202, 0.023...
26.00.01.0[0.3992810255077367, 0.5737548627763441, 0.022...
37.01.01.0[0.40916428022145745, 0.5725048690933248, 0.01...
46.00.00.0[0.4777992886623408, 0.47082971956014313, 0.04...
\n", - "
" - ], - "text/plain": [ - " quality label prediction \\\n", - "0 7.0 1.0 1.0 \n", - "1 6.0 0.0 1.0 \n", - "2 6.0 0.0 1.0 \n", - "3 7.0 1.0 1.0 \n", - "4 6.0 0.0 0.0 \n", - "\n", - " probability \n", - "0 [0.3624807686165096, 0.5962112012919782, 0.038... \n", - "1 [0.4109511317563823, 0.5630846130734202, 0.023... \n", - "2 [0.3992810255077367, 0.5737548627763441, 0.022... \n", - "3 [0.40916428022145745, 0.5725048690933248, 0.01... \n", - "4 [0.4777992886623408, 0.47082971956014313, 0.04... " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "showDF(predictions.select(\"quality\", \"label\", \"prediction\", \"probability\"))" ] @@ -1168,17 +392,9 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Test set accuracy = 0.6010709504685409\n" - ] - } - ], + "outputs": [], "source": [ "# compute accuracy on the test set\n", "evaluator = MulticlassClassificationEvaluator(labelCol=\"label\", predictionCol=\"prediction\",\n", @@ -1186,26 +402,6 @@ "accuracy = evaluator.evaluate(predictions)\n", "print(\"Test set accuracy = \" + str(accuracy))" ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "session.execute(\"\"\"drop table wines\"\"\")" - ] } ], "metadata": { diff --git a/jupyter/Random Forest.ipynb b/jupyter/Random Forest.ipynb index d548234..7fdd499 100755 --- a/jupyter/Random Forest.ipynb +++ b/jupyter/Random Forest.ipynb @@ -23,7 +23,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -33,7 +33,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -61,7 +61,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -76,14 +76,6 @@ " pandas.reset_option('display.max_rows')" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# DataStax Enterprise Analytics\n", - "" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -95,12 +87,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Connect to DSE Analytics Cluster" + "### Connect to Cassandra" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -119,20 +111,9 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "session.execute(\"\"\"\n", " CREATE KEYSPACE IF NOT EXISTS accelerate \n", @@ -150,7 +131,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -166,20 +147,9 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "query = \"CREATE TABLE IF NOT EXISTS wines \\\n", " (wineid int, fixedAcidity float, volatileAcidity float, citricAcid float, sugar float, \\\n", @@ -229,7 +199,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -267,7 +237,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Machine Learning with DSE Analytics and Apache Spark\n", + "## Machine Learning with Apache Cassandra and Apache Spark\n", "" ] }, @@ -275,23 +245,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "#### Create a spark session that is connected to DSE. From there load each table into a Spark Dataframe and take a count of the number of rows in each." + "#### Create a spark session that is connected to the database. From there load each table into a Spark Dataframe and take a count of the number of rows in each." ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Table Wine Row Count: \n", - "6497\n" - ] - } - ], + "outputs": [], "source": [ "spark = SparkSession.builder.appName('demo').master(\"local\").getOrCreate()\n", "\n", @@ -304,150 +265,9 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, - "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", - "
wineidalcoholchloridescitricaciddensityfixedacidityfreesulfurphqualitysugarsulphatestotalsulfurvolatileacidity
0569110.00.0570.280.994256.421.03.266.07.90.3682.00.14
17289.50.0670.020.997006.44.03.465.01.80.6811.00.57
2649011.80.0360.290.989386.125.03.066.02.20.44100.00.34
32089.30.0690.310.996257.826.03.295.01.80.53120.00.57
4193910.20.0490.350.993406.649.03.437.01.50.85141.00.18
\n", - "
" - ], - "text/plain": [ - " wineid alcohol chlorides citricacid density fixedacidity freesulfur \\\n", - "0 5691 10.0 0.057 0.28 0.99425 6.4 21.0 \n", - "1 728 9.5 0.067 0.02 0.99700 6.4 4.0 \n", - "2 6490 11.8 0.036 0.29 0.98938 6.1 25.0 \n", - "3 208 9.3 0.069 0.31 0.99625 7.8 26.0 \n", - "4 1939 10.2 0.049 0.35 0.99340 6.6 49.0 \n", - "\n", - " ph quality sugar sulphates totalsulfur volatileacidity \n", - "0 3.26 6.0 7.9 0.36 82.0 0.14 \n", - "1 3.46 5.0 1.8 0.68 11.0 0.57 \n", - "2 3.06 6.0 2.2 0.44 100.0 0.34 \n", - "3 3.29 5.0 1.8 0.53 120.0 0.57 \n", - "4 3.43 7.0 1.5 0.85 141.0 0.18 " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "showDF(wineDF)" ] @@ -461,150 +281,9 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "metadata": {}, - "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", - "
wineidalcoholchloridescitricaciddensityfixedacidityfreesulfurphqualitysugarsulphatestotalsulfurvolatileacidity
030889.50.0440.740.997206.568.03.186.013.30.54224.00.260
1639510.70.0350.290.991426.444.03.177.01.10.55140.00.105
23819.40.0800.420.997408.311.03.216.02.00.8027.00.260
345299.10.0460.290.998346.639.03.056.014.40.50118.00.220
4431910.90.0290.310.992767.553.03.036.06.50.38160.00.180
\n", - "
" - ], - "text/plain": [ - " wineid alcohol chlorides citricacid density fixedacidity freesulfur \\\n", - "0 3088 9.5 0.044 0.74 0.99720 6.5 68.0 \n", - "1 6395 10.7 0.035 0.29 0.99142 6.4 44.0 \n", - "2 381 9.4 0.080 0.42 0.99740 8.3 11.0 \n", - "3 4529 9.1 0.046 0.29 0.99834 6.6 39.0 \n", - "4 4319 10.9 0.029 0.31 0.99276 7.5 53.0 \n", - "\n", - " ph quality sugar sulphates totalsulfur volatileacidity \n", - "0 3.18 6.0 13.3 0.54 224.0 0.260 \n", - "1 3.17 7.0 1.1 0.55 140.0 0.105 \n", - "2 3.21 6.0 2.0 0.80 27.0 0.260 \n", - "3 3.05 6.0 14.4 0.50 118.0 0.220 \n", - "4 3.03 6.0 6.5 0.38 160.0 0.180 " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "wine6DF = wineDF.filter(\"quality > 5\")\n", "showDF(wine6DF)" @@ -619,176 +298,9 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": {}, - "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", - "
wineidalcoholchloridescitricaciddensityfixedacidityfreesulfurphqualitysugarsulphatestotalsulfurvolatileacidityfeatureslabel
0431710.80.0460.290.995186.859.03.206.010.40.40143.00.16[10.800000190734863, 0.04600000008940697, 0.28...0.0
1337210.90.0590.260.995507.832.03.046.09.50.43178.00.40[10.899999618530273, 0.05900000035762787, 0.25...0.0
248309.40.0560.570.995486.760.02.966.06.60.43150.00.13[9.399999618530273, 0.0560000017285347, 0.5699...0.0
327319.70.0470.340.994406.924.03.206.04.00.52128.00.23[9.699999809265137, 0.04699999839067459, 0.340...0.0
47699.70.0820.020.997447.124.03.556.02.30.5394.00.59[9.699999809265137, 0.0820000022649765, 0.0199...0.0
\n", - "
" - ], - "text/plain": [ - " wineid alcohol chlorides citricacid density fixedacidity freesulfur \\\n", - "0 4317 10.8 0.046 0.29 0.99518 6.8 59.0 \n", - "1 3372 10.9 0.059 0.26 0.99550 7.8 32.0 \n", - "2 4830 9.4 0.056 0.57 0.99548 6.7 60.0 \n", - "3 2731 9.7 0.047 0.34 0.99440 6.9 24.0 \n", - "4 769 9.7 0.082 0.02 0.99744 7.1 24.0 \n", - "\n", - " ph quality sugar sulphates totalsulfur volatileacidity \\\n", - "0 3.20 6.0 10.4 0.40 143.0 0.16 \n", - "1 3.04 6.0 9.5 0.43 178.0 0.40 \n", - "2 2.96 6.0 6.6 0.43 150.0 0.13 \n", - "3 3.20 6.0 4.0 0.52 128.0 0.23 \n", - "4 3.55 6.0 2.3 0.53 94.0 0.59 \n", - "\n", - " features label \n", - "0 [10.800000190734863, 0.04600000008940697, 0.28... 0.0 \n", - "1 [10.899999618530273, 0.05900000035762787, 0.25... 0.0 \n", - "2 [9.399999618530273, 0.0560000017285347, 0.5699... 0.0 \n", - "3 [9.699999809265137, 0.04699999839067459, 0.340... 0.0 \n", - "4 [9.699999809265137, 0.0820000022649765, 0.0199... 0.0 " - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "4113\n" - ] - } - ], + "outputs": [], "source": [ "assembler = VectorAssembler(\n", " inputCols=['alcohol', 'chlorides', 'citricacid', 'density', 'fixedacidity', 'ph', 'freesulfur', 'sugar', 'sulphates', 'totalsulfur', 'volatileacidity'],\n", @@ -812,20 +324,9 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Train Dataframe Row Count: \n", - "3359\n", - "Test Datafram Row Count: \n", - "752\n" - ] - } - ], + "outputs": [], "source": [ "# Split the data into train and test\n", "splits = trainingData1.randomSplit([0.8, 0.2], 1234)\n", @@ -840,225 +341,9 @@ }, { "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Wed May 15 18:10:26 PDT 2019\r\n" - ] - } - ], - "source": [ - "!date" - ] - }, - { - "cell_type": "code", - "execution_count": 15, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "752\n" - ] - }, - { - "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", - "
wineidalcoholchloridescitricaciddensityfixedacidityfreesulfurphqualitysugarsulphatestotalsulfurvolatileacidityfeatureslabelrawPredictionprobabilityprediction
099.50.0730.020.99687.89.03.367.02.00.5718.00.58[9.5, 0.0729999989271164, 0.019999999552965164...1.0[9.396850311426318, 0.5508459750593168, 0.0523...[0.9396850311426318, 0.05508459750593168, 0.00...0.0
11710.50.0920.560.99698.535.03.307.01.80.75103.00.28[10.5, 0.09200000017881393, 0.5600000023841858...1.0[7.872448026522618, 1.81795063588903, 0.294216...[0.7872448026522617, 0.18179506358890296, 0.02...0.0
2219.40.0770.480.99688.929.03.396.01.80.5360.00.22[9.399999618530273, 0.07699999958276749, 0.479...0.0[9.241572488316299, 0.670204601565711, 0.07725...[0.9241572488316301, 0.06702046015657112, 0.00...0.0
31099.60.0910.530.99768.018.03.376.02.50.8080.00.33[9.600000381469727, 0.09099999815225601, 0.529...0.0[8.585164908248752, 1.162295200618395, 0.24652...[0.858516490824875, 0.1162295200618395, 0.0246...0.0
427010.10.1040.510.999611.54.03.286.04.00.9723.00.18[10.100000381469727, 0.10400000214576721, 0.50...0.0[7.155537932285342, 2.686756186951431, 0.15402...[0.7155537932285343, 0.26867561869514317, 0.01...0.0
\n", - "
" - ], - "text/plain": [ - " wineid alcohol chlorides citricacid density fixedacidity freesulfur \\\n", - "0 9 9.5 0.073 0.02 0.9968 7.8 9.0 \n", - "1 17 10.5 0.092 0.56 0.9969 8.5 35.0 \n", - "2 21 9.4 0.077 0.48 0.9968 8.9 29.0 \n", - "3 109 9.6 0.091 0.53 0.9976 8.0 18.0 \n", - "4 270 10.1 0.104 0.51 0.9996 11.5 4.0 \n", - "\n", - " ph quality sugar sulphates totalsulfur volatileacidity \\\n", - "0 3.36 7.0 2.0 0.57 18.0 0.58 \n", - "1 3.30 7.0 1.8 0.75 103.0 0.28 \n", - "2 3.39 6.0 1.8 0.53 60.0 0.22 \n", - "3 3.37 6.0 2.5 0.80 80.0 0.33 \n", - "4 3.28 6.0 4.0 0.97 23.0 0.18 \n", - "\n", - " features label \\\n", - "0 [9.5, 0.0729999989271164, 0.019999999552965164... 1.0 \n", - "1 [10.5, 0.09200000017881393, 0.5600000023841858... 1.0 \n", - "2 [9.399999618530273, 0.07699999958276749, 0.479... 0.0 \n", - "3 [9.600000381469727, 0.09099999815225601, 0.529... 0.0 \n", - "4 [10.100000381469727, 0.10400000214576721, 0.50... 0.0 \n", - "\n", - " rawPrediction \\\n", - "0 [9.396850311426318, 0.5508459750593168, 0.0523... \n", - "1 [7.872448026522618, 1.81795063588903, 0.294216... \n", - "2 [9.241572488316299, 0.670204601565711, 0.07725... \n", - "3 [8.585164908248752, 1.162295200618395, 0.24652... \n", - "4 [7.155537932285342, 2.686756186951431, 0.15402... \n", - "\n", - " probability prediction \n", - "0 [0.9396850311426318, 0.05508459750593168, 0.00... 0.0 \n", - "1 [0.7872448026522617, 0.18179506358890296, 0.02... 0.0 \n", - "2 [0.9241572488316301, 0.06702046015657112, 0.00... 0.0 \n", - "3 [0.858516490824875, 0.1162295200618395, 0.0246... 0.0 \n", - "4 [0.7155537932285343, 0.26867561869514317, 0.01... 0.0 " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "rf = RandomForestClassifier(labelCol=\"label\", featuresCol=\"features\", numTrees=10)\n", "\n", @@ -1072,113 +357,9 @@ }, { "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Wed May 15 18:10:30 PDT 2019\r\n" - ] - } - ], - "source": [ - "!date" - ] - }, - { - "cell_type": "code", - "execution_count": 17, + "execution_count": null, "metadata": {}, - "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", - "
qualitylabelpredictionprobability
07.01.00.0[0.9396850311426318, 0.05508459750593168, 0.00...
17.01.00.0[0.7872448026522617, 0.18179506358890296, 0.02...
26.00.00.0[0.9241572488316301, 0.06702046015657112, 0.00...
36.00.00.0[0.858516490824875, 0.1162295200618395, 0.0246...
46.00.00.0[0.7155537932285343, 0.26867561869514317, 0.01...
\n", - "
" - ], - "text/plain": [ - " quality label prediction \\\n", - "0 7.0 1.0 0.0 \n", - "1 7.0 1.0 0.0 \n", - "2 6.0 0.0 0.0 \n", - "3 6.0 0.0 0.0 \n", - "4 6.0 0.0 0.0 \n", - "\n", - " probability \n", - "0 [0.9396850311426318, 0.05508459750593168, 0.00... \n", - "1 [0.7872448026522617, 0.18179506358890296, 0.02... \n", - "2 [0.9241572488316301, 0.06702046015657112, 0.00... \n", - "3 [0.858516490824875, 0.1162295200618395, 0.0246... \n", - "4 [0.7155537932285343, 0.26867561869514317, 0.01... " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "showDF(predictions.select(\"quality\", \"label\", \"prediction\", \"probability\"))" ] @@ -1192,17 +373,9 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Test set accuracy = 0.7286096256684492\n" - ] - } - ], + "outputs": [], "source": [ "# compute accuracy on the test set\n", "evaluator = MulticlassClassificationEvaluator(labelCol=\"label\", predictionCol=\"prediction\",\n", @@ -1213,30 +386,14 @@ }, { "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], "source": [ "session.execute(\"\"\"drop table wines\"\"\")" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { @@ -1255,7 +412,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.0" + "version": "3.7.3" } }, "nbformat": 4, diff --git a/jupyter/kmeans.ipynb b/jupyter/kmeans.ipynb index 15e0682..1df1eb7 100755 --- a/jupyter/kmeans.ipynb +++ b/jupyter/kmeans.ipynb @@ -23,7 +23,7 @@ }, { "cell_type": "code", - "execution_count": 99, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -33,7 +33,7 @@ }, { "cell_type": "code", - "execution_count": 100, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -62,7 +62,7 @@ }, { "cell_type": "code", - "execution_count": 101, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -81,7 +81,6 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# DataStax Enterprise Analytics\n", "" ] }, @@ -96,12 +95,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Connect to DSE Analytics Cluster" + "### Connect to Cassandra" ] }, { "cell_type": "code", - "execution_count": 102, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -120,20 +119,9 @@ }, { "cell_type": "code", - "execution_count": 103, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 103, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "session.execute(\"\"\"\n", " CREATE KEYSPACE IF NOT EXISTS accelerate \n", @@ -151,7 +139,7 @@ }, { "cell_type": "code", - "execution_count": 105, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -167,20 +155,9 @@ }, { "cell_type": "code", - "execution_count": 106, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 106, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "query = \"CREATE TABLE IF NOT EXISTS socialMedia \\\n", " (status_id int, social_type text, num_reactions int,\\\n", @@ -231,14 +208,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Load Car dataset from CSV file (socialMedia.csv)\n", + "### Load dataset from CSV file (socialMedia.csv)\n", "\n", - "#### Insert all the Car Data into the Apache Cassandra table `socialmedia`" + "#### Insert all the Data into the Apache Cassandra table `socialmedia`" ] }, { "cell_type": "code", - "execution_count": 107, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -264,7 +241,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Machine Learning with DSE Analytics and Apache Spark\n", + "## Machine Learning with Apache Spark\n", "" ] }, @@ -277,18 +254,9 @@ }, { "cell_type": "code", - "execution_count": 109, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Table Row Count: \n", - "6621\n" - ] - } - ], + "outputs": [], "source": [ "spark = SparkSession.builder.appName('demo').master(\"local\").getOrCreate()\n", "\n", @@ -301,138 +269,9 @@ }, { "cell_type": "code", - "execution_count": 110, + "execution_count": null, "metadata": {}, - "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", - "
status_idnum_angrysnum_commentsnum_hahasnum_likesnum_lovesnum_reactionsnum_sadsnum_sharesnum_wowssocial_type
0569101013013010photo
17280101361138001photo
264900352982171724741631video
320806042143000photo
4193905024024000photo
\n", - "
" - ], - "text/plain": [ - " status_id num_angrys num_comments num_hahas num_likes num_loves \\\n", - "0 5691 0 1 0 13 0 \n", - "1 728 0 1 0 136 1 \n", - "2 6490 0 3529 8 217 17 \n", - "3 208 0 6 0 42 1 \n", - "4 1939 0 5 0 24 0 \n", - "\n", - " num_reactions num_sads num_shares num_wows social_type \n", - "0 13 0 1 0 photo \n", - "1 138 0 0 1 photo \n", - "2 247 4 163 1 video \n", - "3 43 0 0 0 photo \n", - "4 24 0 0 0 photo " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "showDF(socialDF)" ] @@ -446,144 +285,9 @@ }, { "cell_type": "code", - "execution_count": 111, + "execution_count": null, "metadata": {}, - "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", - "
status_idnum_angrysnum_commentsnum_hahasnum_likesnum_lovesnum_reactionsnum_sadsnum_sharesnum_wowssocial_typelabel
0569101013013010photo0.0
17280101361138001photo0.0
264900352982171724741631video1.0
320806042143000photo0.0
4193905024024000photo0.0
\n", - "
" - ], - "text/plain": [ - " status_id num_angrys num_comments num_hahas num_likes num_loves \\\n", - "0 5691 0 1 0 13 0 \n", - "1 728 0 1 0 136 1 \n", - "2 6490 0 3529 8 217 17 \n", - "3 208 0 6 0 42 1 \n", - "4 1939 0 5 0 24 0 \n", - "\n", - " num_reactions num_sads num_shares num_wows social_type label \n", - "0 13 0 1 0 photo 0.0 \n", - "1 138 0 0 1 photo 0.0 \n", - "2 247 4 163 1 video 1.0 \n", - "3 43 0 0 0 photo 0.0 \n", - "4 24 0 0 0 photo 0.0 " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "labelIndexer = StringIndexer(inputCol=\"social_type\", outputCol=\"label\", handleInvalid='keep')\n", "training = labelIndexer.fit(socialDF).transform(socialDF)\n", @@ -593,100 +297,18 @@ }, { "cell_type": "code", - "execution_count": 112, + "execution_count": null, "metadata": {}, - "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", - "
social_typelabel
0video1.0
1photo0.0
2photo0.0
3video1.0
4photo0.0
\n", - "
" - ], - "text/plain": [ - " social_type label\n", - "0 video 1.0\n", - "1 photo 0.0\n", - "2 photo 0.0\n", - "3 video 1.0\n", - "4 photo 0.0" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "showDF(training.select(\"social_type\",\"label\"))" ] }, { "cell_type": "code", - "execution_count": 113, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+-----------+-----+\n", - "|social_type|count|\n", - "+-----------+-----+\n", - "| video| 2333|\n", - "| photo| 4288|\n", - "+-----------+-----+\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "training.groupBy('social_type').count().show()" ] @@ -706,33 +328,12 @@ }, { "cell_type": "code", - "execution_count": 88, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 88, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ - "carPanda = training.toPandas()\n", - "carPanda.plot.scatter(x = 'num_likes', y = 'num_comments', c= 'label', figsize=(12,8), colormap='viridis')" + "smPanda = training.toPandas()\n", + "smPanda.plot.scatter(x = 'num_likes', y = 'num_comments', c= 'label', figsize=(12,8), colormap='viridis')" ] }, { @@ -757,7 +358,7 @@ }, { "cell_type": "code", - "execution_count": 122, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -779,163 +380,9 @@ }, { "cell_type": "code", - "execution_count": 123, + "execution_count": null, "metadata": {}, - "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", - "
status_idnum_angrysnum_commentsnum_hahasnum_likesnum_lovesnum_reactionsnum_sadsnum_sharesnum_wowssocial_typelabelfeaturesprediction
0569101013013010photo0.0[13.0, 1.0]0
17280101361138001photo0.0[136.0, 1.0]0
264900352982171724741631video1.0[217.0, 3529.0]1
320806042143000photo0.0[42.0, 6.0]0
4193905024024000photo0.0[24.0, 5.0]0
\n", - "
" - ], - "text/plain": [ - " status_id num_angrys num_comments num_hahas num_likes num_loves \\\n", - "0 5691 0 1 0 13 0 \n", - "1 728 0 1 0 136 1 \n", - "2 6490 0 3529 8 217 17 \n", - "3 208 0 6 0 42 1 \n", - "4 1939 0 5 0 24 0 \n", - "\n", - " num_reactions num_sads num_shares num_wows social_type label \\\n", - "0 13 0 1 0 photo 0.0 \n", - "1 138 0 0 1 photo 0.0 \n", - "2 247 4 163 1 video 1.0 \n", - "3 43 0 0 0 photo 0.0 \n", - "4 24 0 0 0 photo 0.0 \n", - "\n", - " features prediction \n", - "0 [13.0, 1.0] 0 \n", - "1 [136.0, 1.0] 0 \n", - "2 [217.0, 3529.0] 1 \n", - "3 [42.0, 6.0] 0 \n", - "4 [24.0, 5.0] 0 " - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "kmeans = KMeans().setK(2).setSeed(1)\n", "model = kmeans.fit(trainingData)\n", @@ -957,30 +404,9 @@ }, { "cell_type": "code", - "execution_count": 125, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+----------+-----+\n", - "|prediction|count|\n", - "+----------+-----+\n", - "| 1| 137|\n", - "| 0| 6484|\n", - "+----------+-----+\n", - "\n", - "+-----------+-----+\n", - "|social_type|count|\n", - "+-----------+-----+\n", - "| video| 2333|\n", - "| photo| 4288|\n", - "+-----------+-----+\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "predictions.groupBy('prediction').count().show()\n", "training.groupBy('social_type').count().show()" @@ -997,30 +423,9 @@ }, { "cell_type": "code", - "execution_count": 121, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 121, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "car_df = predictions.toPandas()\n", "\n", @@ -1047,33 +452,6 @@ "source": [ "# Remember Data Science and analytics is an iterative process! It's a science! Hypothesis, test, analysis, and loop again! " ] - }, - { - "cell_type": "code", - "execution_count": 71, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 71, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "session.execute(\"\"\"drop table socialmedia\"\"\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { @@ -1092,7 +470,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.0" + "version": "3.7.3" } }, "nbformat": 4,