{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "provenance": [], "authorship_tag": "ABX9TyMbydap87eI4FgsfMk8E//N", "include_colab_link": true }, "kernelspec": { "name": "python3", "display_name": "Python 3" }, "language_info": { "name": "python" } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "view-in-github", "colab_type": "text" }, "source": [ "\"Open" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "wQW6K0obfV9V", "outputId": "e9976106-92f4-494b-c774-594cee151649" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n", "Requirement already satisfied: kaggle in /usr/local/lib/python3.8/dist-packages (1.5.12)\n", "Requirement already satisfied: python-slugify in /usr/local/lib/python3.8/dist-packages (from kaggle) (8.0.0)\n", "Requirement already satisfied: urllib3 in /usr/local/lib/python3.8/dist-packages (from kaggle) (1.24.3)\n", "Requirement already satisfied: certifi in /usr/local/lib/python3.8/dist-packages (from kaggle) (2022.12.7)\n", "Requirement already satisfied: tqdm in /usr/local/lib/python3.8/dist-packages (from kaggle) (4.64.1)\n", "Requirement already satisfied: python-dateutil in /usr/local/lib/python3.8/dist-packages (from kaggle) (2.8.2)\n", "Requirement already satisfied: six>=1.10 in /usr/local/lib/python3.8/dist-packages (from kaggle) (1.15.0)\n", "Requirement already satisfied: requests in /usr/local/lib/python3.8/dist-packages (from kaggle) (2.25.1)\n", "Requirement already satisfied: text-unidecode>=1.3 in /usr/local/lib/python3.8/dist-packages (from python-slugify->kaggle) (1.3)\n", "Requirement already satisfied: chardet<5,>=3.0.2 in /usr/local/lib/python3.8/dist-packages (from requests->kaggle) (4.0.0)\n", "Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.8/dist-packages (from requests->kaggle) (2.10)\n" ] } ], "source": [ "!pip install kaggle" ] }, { "cell_type": "code", "source": [ "!mkdir ~/.kaggle" ], "metadata": { "id": "jkuj__QBf1pB" }, "execution_count": 2, "outputs": [] }, { "cell_type": "code", "source": [ "import pandas as pd\n", "import seaborn as sns\n", "import matplotlib.pyplot as plt" ], "metadata": { "id": "xXDJXFjOgjK4" }, "execution_count": 3, "outputs": [] }, { "cell_type": "code", "source": [ "import nltk\n", "nltk.download('vader_lexicon')" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "DGyvjkSiprJi", "outputId": "f47bfb2b-25c4-45e7-a427-b94db02a4124" }, "execution_count": 4, "outputs": [ { "output_type": "stream", "name": "stderr", "text": [ "[nltk_data] Downloading package vader_lexicon to /root/nltk_data...\n" ] }, { "output_type": "execute_result", "data": { "text/plain": [ "True" ] }, "metadata": {}, "execution_count": 4 } ] }, { "cell_type": "code", "source": [ "from nltk.sentiment.vader import SentimentIntensityAnalyzer\n", "sentiments = SentimentIntensityAnalyzer()" ], "metadata": { "id": "CadX-IbPpWjl" }, "execution_count": 5, "outputs": [] }, { "cell_type": "code", "source": [ "data = pd.read_csv(\"Hotel_Reviews.csv\")\n", "print(data.head())" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "jOGcID0Ope52", "outputId": "cd28535c-72ce-4276-983f-84376f6fd69d" }, "execution_count": 43, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ " address categories city country latitude longitude \\\n", "0 Riviera San Nicol 11/a Hotels Mableton US 45.421611 12.376187 \n", "1 Riviera San Nicol 11/a Hotels Mableton US 45.421611 12.376187 \n", "2 Riviera San Nicol 11/a Hotels Mableton US 45.421611 12.376187 \n", "3 Riviera San Nicol 11/a Hotels Mableton US 45.421611 12.376187 \n", "4 Riviera San Nicol 11/a Hotels Mableton US 45.421611 12.376187 \n", "\n", " name postalCode province reviews.date \\\n", "0 Hotel Russo Palace 30126 GA 2013-09-22T00:00:00Z \n", "1 Hotel Russo Palace 30126 GA 2015-04-03T00:00:00Z \n", "2 Hotel Russo Palace 30126 GA 2014-05-13T00:00:00Z \n", "3 Hotel Russo Palace 30126 GA 2013-10-27T00:00:00Z \n", "4 Hotel Russo Palace 30126 GA 2015-03-05T00:00:00Z \n", "\n", " reviews.dateAdded reviews.doRecommend reviews.id reviews.rating \\\n", "0 2016-10-24T00:00:25Z NaN NaN 4.0 \n", "1 2016-10-24T00:00:25Z NaN NaN 5.0 \n", "2 2016-10-24T00:00:25Z NaN NaN 5.0 \n", "3 2016-10-24T00:00:25Z NaN NaN 5.0 \n", "4 2016-10-24T00:00:25Z NaN NaN 5.0 \n", "\n", " reviews.text \\\n", "0 Pleasant 10 min walk along the sea front to th... \n", "1 Really lovely hotel. Stayed on the very top fl... \n", "2 Ett mycket bra hotell. Det som drog ner betyge... \n", "3 We stayed here for four nights in October. The... \n", "4 We stayed here for four nights in October. The... \n", "\n", " reviews.title reviews.userCity reviews.username \\\n", "0 Good location away from the crouds NaN Russ (kent) \n", "1 Great hotel with Jacuzzi bath! NaN A Traveler \n", "2 Lugnt l��ge NaN Maud \n", "3 Good location on the Lido. NaN Julie \n", "4 ������ ��������������� NaN sungchul \n", "\n", " reviews.userProvince \n", "0 NaN \n", "1 NaN \n", "2 NaN \n", "3 NaN \n", "4 NaN \n" ] } ] }, { "cell_type": "code", "source": [ "# get the unique countries in the file\n", "data[\"country\"].unique()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "7dcEw2OyQU_u", "outputId": "7a37e374-1fe4-46ce-8f0e-97c8323de66e" }, "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "array(['US'], dtype=object)" ] }, "metadata": {}, "execution_count": 46 } ] }, { "cell_type": "code", "source": [ "# get the unique hotel names in the file \n", "data[\"name\"].unique()" ], "metadata": { "id": "kBHMcqUHQkHi" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "data[\"reviews.rating\"].unique()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "fYsFlry9R97A", "outputId": "dc8bf123-fd24-4fb8-bf83-d3233793be5c" }, "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "array([ 4. , 5. , 3. , 1. , 2. , 0. , 4.1, nan, 4.9, 4.8, 3.4,\n", " 2.4, 3.1, 3.2, 3.3, 9.6, 10. , 8.3, 8.8, 9.2, 7.5, 7.9,\n", " 7.1, 3.8, 5.8, 6.7, 6.3, 4.2, 4.5, 3.9, 1.3, 4.3, 4.7,\n", " 2.8, 4.4, 1.5, 4.6, 3.7, 5.4, 2.5, 6. , 2.9, 7. , 9.5])" ] }, "metadata": {}, "execution_count": 16 } ] }, { "cell_type": "code", "source": [ "# fill the null reviews of the Hotels with 0\n", "data['reviews.rating']=data['reviews.rating'].fillna(0)" ], "metadata": { "id": "30mgPjRvTr14" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "# create a range of 5 maximum review numbers\n", "for i in range(0,len(data)):\n", " if(data['reviews.rating'].loc[i] > 5):\n", " temp = data['reviews.rating'].loc[i]\n", " newtemp = (temp/10)*5\n", " data.at[i,'reviews.rating'] = newtemp" ], "metadata": { "id": "fUa0csNRT7NJ" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "ratings = data[\"reviews.rating\"].value_counts()\n", "numbers = ratings.index\n", "quantity = ratings.values\n", "ratings" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "ssVh-6k-qmLD", "outputId": "d52819b9-fcca-4c5b-9a3c-25bcbc39649d" }, "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "5.00 12772\n", "4.00 9755\n", "3.00 5709\n", "1.00 3068\n", "2.00 2979\n", "0.00 1199\n", "4.80 78\n", "4.60 56\n", "4.40 30\n", "4.30 26\n", "4.15 25\n", "3.75 24\n", "3.95 24\n", "4.20 22\n", "3.40 17\n", "4.10 14\n", "3.15 14\n", "4.50 13\n", "3.55 13\n", "3.35 12\n", "2.70 9\n", "3.10 7\n", "2.90 7\n", "4.70 6\n", "3.30 6\n", "4.90 6\n", "2.40 4\n", "3.80 3\n", "2.50 3\n", "3.20 2\n", "3.90 2\n", "3.70 2\n", "1.30 1\n", "2.80 1\n", "1.50 1\n", "3.50 1\n", "4.75 1\n", "Name: reviews.rating, dtype: int64" ] }, "metadata": {}, "execution_count": 51 } ] }, { "cell_type": "code", "source": [ "# round decimal places in rating\n", "ratings=data['reviews.rating'].round(0).value_counts()" ], "metadata": { "id": "udysK--Au3Yo" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "# create indexes from rating value and counts\n", "numbers = ratings.index\n", "quantity = ratings.values" ], "metadata": { "id": "ebcAMh2ivv4m" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "# assign color to each rating and revise the chart to see the share of rating values \n", "custom_colors = [\"tan\", \"grey\", 'silver', \"black\", \"yellow\"]\n", "plt.figure(figsize=(5, 5))\n", "plt.pie(quantity, labels=numbers, colors=custom_colors)\n", "central_circle = plt.Circle((0, 0), 0.5, color='white')\n", "fig = plt.gcf()\n", "fig.gca().add_artist(central_circle)\n", "plt.rc('font', size=12)\n", "plt.title(\"Hotel Reviews Ratings\", fontsize=20)\n", "plt.show()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 324 }, "id": "8E6BAJQsqhDN", "outputId": "52b24c24-609b-4aa3-cd62-e4c51d15ba39" }, "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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\n" }, "metadata": {} } ] }, { "cell_type": "code", "source": [ "# Sentiment analysis - analyzer, transformers, textblob, ..." ], "metadata": { "id": "gRp6ILtBFpGJ" }, "execution_count": 6, "outputs": [] }, { "cell_type": "code", "source": [ "# add sentiment anaylsis columns\n", "from nltk.sentiment.vader import SentimentIntensityAnalyzer" ], "metadata": { "id": "Mk6vE5pDTaa6" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "pip install -q transformers" ], "metadata": { "id": "PSB7vEagTauK" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "from transformers import pipeline\n", "sentiment_pipeline = pipeline(\"sentiment-analysis\")\n", "rt = data[\"reviews.text\"]\n", "rt" ], "metadata": { "id": "IS6EdnaEcchV" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "sid = SentimentIntensityAnalyzer()" ], "metadata": { "id": "fp1ek1QmTapP" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "pip install TextBlob" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "7NYk9FSMiF7t", "outputId": "6547694e-6572-461e-e7fb-e097d0500e8b" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n", "Requirement already satisfied: TextBlob in /usr/local/lib/python3.8/dist-packages (0.15.3)\n", "Requirement already satisfied: nltk>=3.1 in /usr/local/lib/python3.8/dist-packages (from TextBlob) (3.7)\n", "Requirement already satisfied: joblib in /usr/local/lib/python3.8/dist-packages (from nltk>=3.1->TextBlob) (1.2.0)\n", "Requirement already satisfied: click in /usr/local/lib/python3.8/dist-packages (from nltk>=3.1->TextBlob) (7.1.2)\n", "Requirement already satisfied: tqdm in /usr/local/lib/python3.8/dist-packages (from nltk>=3.1->TextBlob) (4.64.1)\n", "Requirement already satisfied: regex>=2021.8.3 in /usr/local/lib/python3.8/dist-packages (from nltk>=3.1->TextBlob) (2022.6.2)\n" ] } ] }, { "cell_type": "code", "source": [ "# install bs libraries to get the information, you can use selenium or scrapy as well\n", "import requests\n", "from bs4 import BeautifulSoup\n", "import pandas as pd\n", "import csv" ], "metadata": { "id": "S9LAtvgHGCcr" }, "execution_count": 21, "outputs": [] }, { "cell_type": "code", "source": [ "# extract the HTML content and create an url object\n", "url = ('https://www.tripadvisor.in/Hotels-g28932-Hawaii-Hotels.html')" ], "metadata": { "id": "lJ1HszVLIvJi" }, "execution_count": 22, "outputs": [] }, { "cell_type": "code", "source": [ "user_agent = ({'User-Agent':\n", "\t\t\t'Mozilla/5.0 (Windows NT 10.0; Win64; x64) \\\n", "\t\t\tAppleWebKit/537.36 (KHTML, like Gecko) \\\n", "\t\t\tChrome/90.0.4430.212 Safari/537.36',\n", "\t\t\t'Accept-Language': 'en-US, en;q=0.5'})\n", "\n", "def get_page_contents(url):\n", " page = requests.get(url, headers = user_agent)\n", " return BeautifulSoup(page.text, 'html.parser')" ], "metadata": { "id": "EbJKA0HAIOgd" }, "execution_count": 23, "outputs": [] }, { "cell_type": "code", "source": [ "soup = get_page_contents(url)\n", "\n", "# Find and extract the data elements.\n", "hotels = []\n", "for name in soup.findAll('div',{'class':'listing_title'}):\n", " hotels.append(name.text.strip())\n", "\n", "ratings = []\n", "for rating in soup.findAll('a',{'class':'ui_bubble_rating'}):\n", " ratings.append(rating['alt']) \n", "\n", "reviews = []\n", "for review in soup.findAll('a',{'class':'review_count'}):\n", " reviews.append(review.text.strip())\n", "\n", "prices = []\n", "for p in soup.findAll('div',{'class':'price-wrap'}):\n", " prices.append(p.text.replace('₹','').strip()) " ], "metadata": { "id": "UgyfAm4BOP58" }, "execution_count": 45, "outputs": [] }, { "cell_type": "code", "source": [ "# save column names into dictionary\n", "dict = {'Hotel Names':hotels,'Ratings':ratings,'Number of Reviews':reviews,'Prices':prices}\n", "\n", "# create the dataframe\n", "information = pd.DataFrame.from_dict(dict)\n", "information.head(10)\n", "\n", "# convert dataframe to CSV file\n", "information.to_csv('hotels.csv', index=False, header=True)" ], "metadata": { "id": "TVGUreQiOWtc" }, "execution_count": 46, "outputs": [] }, { "cell_type": "code", "source": [ "# get text reviews using beautiful soup scraping" ], "metadata": { "id": "7CZbdXzTWv7t" }, "execution_count": 47, "outputs": [] }, { "cell_type": "code", "source": [ "from bs4 import BeautifulSoup\n", "import re\n", "import requests\n", "import pandas as pd\n", "\n", "headers = {'User-Agent':\n", " 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36'}\n", "\n", "page = \"https://www.yelp.com/biz/fairmont-san-francisco-san-francisco?sort_by=rating_desc\"\n", "page_num =0\n", "session = requests.Session()\n", "review_comments = []\n", "while True:\n", " pageTree = session.get(page, headers=headers)\n", " pageSoup = BeautifulSoup(pageTree.content, 'html.parser')\n", " posts = pageSoup.select('p[lang=\"en\"]')\n", " for post in posts:\n", " comments = post.get_text().replace('\\n', '').strip()\n", " #print(comments)\n", " review_comments.append(comments)\n", "\n", " if pageSoup.find(\"span\", text=re.compile(\"Next\")):\n", " page = \"https://www.yelp.com/biz/fairmont-san-francisco-san-francisco?start={}&sort_by=rating_desc\".format(page_num)\n", " page_num += 20\n", " else:\n", " break\n", "\n", "df = pd.DataFrame({\"Review_Comments\": review_comments})\n", "print(df)\n", "df.to_csv('filename.csv')" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "1DOEgK7sOoQ5", "outputId": "5437eb6f-f5d5-4d13-8a72-2632c7f564d1" }, "execution_count": 48, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Empty DataFrame\n", "Columns: [Review_Comments]\n", "Index: []\n" ] } ] }, { "cell_type": "code", "source": [ "df = pd.read_csv('filename.csv')\n", "\n", "print(df.to_string()) " ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "AWqooIXfVdcl", "outputId": "d69c4059-79b4-4a45-b5aa-b454835d2473" }, "execution_count": 44, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Empty DataFrame\n", "Columns: [Unnamed: 0, Review_Comments]\n", "Index: []\n" ] } ] }, { "cell_type": "code", "source": [ "# Install the packages.\n", "!pip install beautifulsoup4 requests pandas\n", "# Import the required libraries.\n", "import requests\n", "from bs4 import BeautifulSoup\n", "import pandas as pd\n", "import csv" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "K6N8ZoTub95i", "outputId": "536ffad0-9c54-49b1-b840-06efb6140eca" }, "execution_count": 49, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/\n", "Requirement already satisfied: beautifulsoup4 in /usr/local/lib/python3.8/dist-packages (4.6.3)\n", "Requirement already satisfied: requests in /usr/local/lib/python3.8/dist-packages (2.25.1)\n", "Requirement already satisfied: pandas in /usr/local/lib/python3.8/dist-packages (1.3.5)\n", "Requirement already satisfied: urllib3<1.27,>=1.21.1 in /usr/local/lib/python3.8/dist-packages (from requests) (1.26.14)\n", "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.8/dist-packages (from requests) (2022.12.7)\n", "Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.8/dist-packages (from requests) (2.10)\n", "Requirement already satisfied: chardet<5,>=3.0.2 in /usr/local/lib/python3.8/dist-packages (from requests) (4.0.0)\n", "Requirement already satisfied: pytz>=2017.3 in /usr/local/lib/python3.8/dist-packages (from pandas) (2022.7.1)\n", "Requirement already satisfied: numpy>=1.17.3 in /usr/local/lib/python3.8/dist-packages (from pandas) (1.22.4)\n", "Requirement already satisfied: python-dateutil>=2.7.3 in /usr/local/lib/python3.8/dist-packages (from pandas) (2.8.2)\n", "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.8/dist-packages (from python-dateutil>=2.7.3->pandas) (1.15.0)\n" ] } ] }, { "cell_type": "code", "source": [ "names = []\n", "for links in soup.find_all('div', class_='name'):\n", " name = links.get_text().strip()\n", " names.append(name)" ], "metadata": { "id": "SU2bXbB1cF6R" }, "execution_count": 50, "outputs": [] }, { "cell_type": "code", "source": [ "# Extract the HTML and create a BeautifulSoup object.\n", "url = 'https://www.metacritic.com/game/switch/super-mario-3d-world-+-bowsers-fury/user-reviews'\n", "\n", "user_agent = {'User-agent': 'Mozilla/5.0'}\n", "\n", "def get_page_contents(url):\n", " page = requests.get(url, headers = user_agent)\n", " return BeautifulSoup(page.text, 'html.parser')\n", "\n", "soup = get_page_contents(url)" ], "metadata": { "id": "RMJzN5MJcSOD" }, "execution_count": 51, "outputs": [] }, { "cell_type": "code", "source": [ "names = []\n", "for links in soup.find_all('div', class_='name'):\n", " name = links.get_text().strip()\n", " names.append(name)\n", "dates = []\n", "for links in soup.find_all('div', class_='date'):\n", " date = links.get_text()\n", " dates.append(date)\n", "ratings = [] \n", "for links in soup.find_all('div', class_='metascore_w user medium game positive indiv'):\n", " score = links.get_text()\n", " ratings.append(score)\n", "reviews = [] \n", "for links in soup.find_all('span', class_='blurb blurb_expanded'):\n", " review = links.get_text()\n", " reviews.append(review)\n", "\n", "for links in soup.find_all('span', class_='blurb blurb_collapsed'):\n", " review = links.get_text()\n", " reviews.append(review)" ], "metadata": { "id": "2nEwOgAFcSt1" }, "execution_count": 52, "outputs": [] }, { "cell_type": "code", "source": [ "# Create the dictionary.\n", "games_dict = {'Name': names, 'Date': dates, 'Rating': ratings, 'Review': reviews}" ], "metadata": { "id": "imTYtJyicS7_" }, "execution_count": 53, "outputs": [] }, { "cell_type": "code", "source": [ "# Print the lengths of each list. \n", "print(len(names), len(dates), len(ratings), len(reviews))" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "9CjoEFcWcPVV", "outputId": "f555bdc3-bc37-4377-941f-14ba8d44bd2f" }, "execution_count": 55, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "100 103 35 76\n" ] } ] }, { "cell_type": "code", "source": [ "# Create the data frame.\n", "game = pd.DataFrame.from_dict(games_dict, orient='index')\n", "games = game.transpose()" ], "metadata": { "id": "tMNxRo_VcPxW" }, "execution_count": 56, "outputs": [] }, { "cell_type": "code", "source": [ "games.head(4)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 205 }, "id": "jxtlWTtYc5eD", "outputId": "af260217-9920-4fa9-bcf0-78453f43ae61" }, "execution_count": 57, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " Name Date Rating \\\n", "0 nahobino5_ Jun 27, 2021 8 \n", "1 BlueNightDev Feb 17, 2021 9 \n", "2 SuperkenGaming Feb 18, 2021 9 \n", "3 anyu Feb 14, 2021 9 \n", "\n", " Review \n", "0 A luxurious and high-caliber platform game tha... \n", "1 I, like many others, didn't like 3d World when... \n", "2 I didn't had a wii U so I had never experience... \n", "3 This is a great bundle from Nintendo. Not only... " ], "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", "
NameDateRatingReview
0nahobino5_Jun 27, 20218A luxurious and high-caliber platform game tha...
1BlueNightDevFeb 17, 20219I, like many others, didn't like 3d World when...
2SuperkenGamingFeb 18, 20219I didn't had a wii U so I had never experience...
3anyuFeb 14, 20219This is a great bundle from Nintendo. Not only...
\n", "
\n", " \n", " \n", " \n", "\n", " \n", "
\n", "
\n", " " ] }, "metadata": {}, "execution_count": 57 } ] }, { "cell_type": "code", "source": [ "games.to_csv('reviews.csv', index=False, header=True)\n", "reviews = pd.read_csv('reviews.csv', lineterminator='\\n')" ], "metadata": { "id": "9kpsshpdc5ta" }, "execution_count": 58, "outputs": [] }, { "cell_type": "code", "source": [ "print(reviews)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "rZtoC9mYc59x", "outputId": "19855ff0-226b-4ca5-8331-411c0e765361" }, "execution_count": 59, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ " Name Date Rating \\\n", "0 nahobino5_ Jun 27, 2021 8.0 \n", "1 BlueNightDev Feb 17, 2021 9.0 \n", "2 SuperkenGaming Feb 18, 2021 9.0 \n", "3 anyu Feb 14, 2021 9.0 \n", "4 JordiMesen Feb 14, 2021 9.0 \n", ".. ... ... ... \n", "98 mbestvina Feb 16, 2021 NaN \n", "99 EdwardG Mar 4, 2021 NaN \n", "100 NaN Oct 22, 2021 NaN \n", "101 NaN Oct 12, 2021 NaN \n", "102 NaN May 17, 2021 NaN \n", "\n", " Review \n", "0 A luxurious and high-caliber platform game tha... \n", "1 I, like many others, didn't like 3d World when... \n", "2 I didn't had a wii U so I had never experience... \n", "3 This is a great bundle from Nintendo. Not only... \n", "4 This is an Amazing game! I absolutely love eac... \n", ".. ... \n", "98 NaN \n", "99 NaN \n", "100 NaN \n", "101 NaN \n", "102 NaN \n", "\n", "[103 rows x 4 columns]\n" ] } ] }, { "cell_type": "code", "source": [], "metadata": { "id": "_YbqB69UcP12" }, "execution_count": null, "outputs": [] } ] }