price. Using this sample, what is your best point estimate of the population mean?\n",
+ "\n",
+ "\n",
+ "- Since you have access to the population, simulate the sampling distribution for the average home price in Ames by taking 5000 samples from the population of size 50 and computing 5000 sample means. Store these means in a vector called sample_means50. Plot the data, then describe the shape of this sampling distribution. Based on this sampling distribution, what would you guess the mean home price of the population to be? Finally, calculate and report the population mean.\n",
+ "\n",
+ "\n",
+ "- Change your sample size from 50 to 150, then compute the sampling distribution using the same method as above, and store these means in a new vector called sample_means150. Describe the shape of this sampling distribution, and compare it to the sampling distribution for a sample size of 50. Based on this sampling distribution, what would you guess to be the mean sale price of homes in Ames?\n",
+ "\n",
+ "\n",
+ "- Of the sampling distributions from 2 and 3, which has a smaller spread? If we’re concerned with making estimates that are more often close to the true value, would we prefer a distribution with a large or small spread?\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import pandas as pd\n",
+ "import numpy as np\n",
+ "import matplotlib.pyplot as plt\n",
+ "%matplotlib inline"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "%config InlineBackend.figure_format = 'retina'\n",
+ "plt.style.use(\"seaborn\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "df = pd.read_csv('ames.csv')\n",
+ "price = df['SalePrice']"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Question 1"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "187271.76"
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "price.sample(50 , random_state = 42).mean()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Question 2"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "sample_mean50 = []\n",
+ "\n",
+ "for i in range(5000):\n",
+ " sample_price = np.array(list(price.sample(50).values))\n",
+ " sample_mean50.append(sample_price.mean())\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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inxsFsCxat0zL3f3ECrKwIH9kiSNjU3v+TW15475bQ0HAKANK9QAAABQQKAGAACAAgI1AAAAFBCoAQAAoIBADQAAAAUEagAAACggUAMAAEABgRoAAAAKCNQAAABQQKAGAACAAgI1AAAAFBCoAQAAoIBADQAAAAUEagAAACggUAMAAEABgRoAAAAKCNQAAABQQKAGAACAAgI1AAAAFBCoAQAAoIBADQAAAAUEagAAACggUAMAAEABgRoAAAAKCNQAAABQQKAGAACAAgI1AAAAFBCoAQAAoIBADQAAAAUEagAAACggUAMAAEABgRoAAAAKCNQAAABQQKAGAACAAgI1AAAAFBCoAQAAoIBADQAAAAUEagAAACggUAMAAEABgRoAAAAKCNQAAABQQKAGAACAAgI1AAAAFDiuuwcAAJ1p3TMvd/cQPvBqzx3T3UMAgA8EK9QAAABQQKAGAACAAgI1AAAAFBCoAQAAoIBADQAAAAUEagAAACggUAMAAEABgRoAAAAKCNQAAABQQKAGAACAAgI1AAAAFBCoAQAAoIBADQAAAAUEagAAACggUAMAAEABgRoAAAAKCNQAAABQQKAGAACAAp0eqHfu3JmJEydm5cqV7c7t27cvt9xySz7xiU/kzDPPzOTJk/P5z38+P/vZzzq81vr16zNnzpxMmDAhU6dOzU033ZT6+voOa1944YXMnz8/kyZNSk1NTa677rq8+uqrnTk1AAAAaNWpgbqxsTHXXntt9u3b1+7c66+/nj/5kz/Jt7/97Zx00km5/PLLc8455+Tpp5/OnDlz8vzzz7epf/TRR1NXV5f6+vrMnTs3U6ZMycMPP5zLLrsse/bsaVO7cePGXH755dmyZUsuvvjinH/++Xnqqacye/bsbN++vTOnCAAAAEmS4zrrQjt27Mi1116bn/70px2ev++++7J58+Zcfvnl+fM///PW488991zmz5+fxYsX55FHHknyVjBfsmRJqqqqsm7dugwaNChJMm3atCxatCh33HFHFi5cmCRpbm7Ol7/85QwYMCAPPfRQPvShDyVJLrroolxxxRW55ZZbsmzZss6aJgAAACTppBXqlStXZubMmdm8eXOmTJnSYc0TTzyRXr165c/+7M/aHK+pqUlNTU3+9V//NTt37kySPPbYY2loaMj8+fNbw3SSzJ49O6NHj87atWtz6NChJMmPfvSjbN26NbNnz24N00kyderUTJs2LU8++WR2797dGdMEAACAVp0SqO+5556MHDky9913Xz796U93WDNnzpxcf/31bQJyi759+yZ5a2U6eesW7iSZPHlyu9qampo0NDRky5Yt71o7efLkHDp0qN3t5AAAAHC0OuWW769+9as555xz0qdPn2zbtq3DmksuuaTD47/+9a+zadOmnHDCCTnttNOSpHUzsaqqqnb1LTVbt27NuHHj3rF25MiRSXLEMQEAAECpTgnU5557bvFr/+f//J9pbGzM3LlzW1eqd+/enb59+6Z///7t6ltWuFs2PmtoaEiSDBky5Ii1e/fuLR5fkowYMfioXl9petp8egI9qTzd1ZOBA/t1y/tWOn8uXeu9/P33uVV59KSy6Efl0ZPK0xN60q3PoV6+fHnWrl2bkSNH5vrrr289fvDgwdZw/XYtx5uampIkBw4caHO8o9r9+/d36rgBAACg03b5fr9uu+22LF++PMOGDctdd92VoUOHtp7r379/a1B+u5ZwPGDAgNbaJB3Wv7221K5dR7fCXSlavgHqKfPpCfSk8nR3Txobm7rlfStVy8q0P5eu9U5//7v73wjt6Ull0Y/KoyeVpxJ7Urpa3uUr1IcOHcqiRYuyfPnynHTSSfnOd76Tj370o21qhgwZkqampg5Xlltu9R48eHBrbdLxbd1vrwUAAIDO0qWBev/+/fnv//2/Z82aNRk5cmTuv//+jBs3rl1ddXV1kmT79u3tzrUcGz169PuuBQAAgM7SZYG6ubk5N954Y5566ql89KMfzXe/+93WMPx2EydOTPIfj8T6TRs2bMjgwYMzduzYd6197rnn0rt375x11lmdNAsAAAB4S5cF6nvvvTdPPPFERo0alXvuuSennHLKEWtnzJiRgQMHZsWKFa27eCfJmjVrsm3btlxyySXp3futodfU1OTUU0/N6tWr26xSP/vss/nhD3+YT3ziExk+fPhvb2IAAAAck7pkU7L9+/dn+fLlSZIzzjgjq1at6rDusssuy4gRIzJs2LAsWLAgixcvTm1tbS688MLs3Lkzjz/+eKqrq1NXV9f6mj59+uTmm2/O5z//+cyaNSszZ87M66+/nkceeSQnnnhiFixY0BVTBAAA4BjTJYH65z//eXbv3p0keeKJJ/LEE090WDdjxoyMGDEiSTJ37twMHTo0K1asyKpVqzJ06NDU1tbm+uuvz7Bhw9q87uMf/3hWrFiR22+/PWvWrMkJJ5yQ6dOn54YbbkhVVdVvd3IAAAAck3o1Nzc3d/cgKl0lbed+NCpxe/pjnZ5Unu7uybpnXu6W961UHpvVPWrPHXPEc939b4T29KSy6Efl0ZPKU4k9+cA8NgsAAAB6AoEaAAAACgjUAAAAUECgBgAAgAICNQAAABQQqAEAAKCAQA0AAAAFBGoAAAAoIFADAABAAYEaAAAACgjUAAAAUECgBgAAgAICNQAAABQQqAEAAKCAQA0AAAAFBGoAAAAoIFADAABAAYEaAAAACgjUAAAAUECgBgAAgAICNQAAABQQqAEAAKCAQA0AAAAFBGoAAAAoIFADAABAAYEaAAAACgjUAAAAUECgBgAAgAICNQAAABQQqAEAAKCAQA0AAAAFBGoAAAAoIFADAABAAYEaAAAACgjUAAAAUECgBgAAgAICNQAAABQQqAEAAKCAQA0AAAAFBGoAAAAoIFADAABAAYEaAAAACgjUAAAAUECgBgAAgAICNQAAABQQqAEAAKCAQA0AAAAFBGoAAAAoIFADAABAAYEaAAAACgjUAAAAUECgBgAAgAICNQAAABQQqAEAAKCAQA0AAAAFBGoAAAAoIFADAABAAYEaAAAACgjUAAAAUECgBgAAgAICNQAAABQQqAEAAKCAQA0AAAAFBGoAAAAoIFADAABAAYEaAAAACgjUAAAAUECgBgAAgAKdHqh37tyZiRMnZuXKlR2eX7duXWprazN+/Picd955Wbp0aRobGzusXb9+febMmZMJEyZk6tSpuemmm1JfX99h7QsvvJD58+dn0qRJqampyXXXXZdXX321s6YFAAAAbXRqoG5sbMy1116bffv2dXj+rrvuysKFC3P48OHMmzcv48aNy8qVK3PVVVdl//79bWofffTR1NXVpb6+PnPnzs2UKVPy8MMP57LLLsuePXva1G7cuDGXX355tmzZkosvvjjnn39+nnrqqcyePTvbt2/vzCkCAABAkuS4zrrQjh07cu211+anP/1ph+dfe+21LFu2LBMmTMi9996b448/Pkly2223Zfny5XnggQcyb968JG8F8yVLlqSqqirr1q3LoEGDkiTTpk3LokWLcscdd2ThwoVJkubm5nz5y1/OgAED8tBDD+VDH/pQkuSiiy7KFVdckVtu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u+229OrVK83NzfniF7+YdevW5amnnsr06dOTJK+99lqWLVuWCRMm5N57783xxx+fJLntttuyfPnyPPDAA5k3b15XThMAAIBjQJeuUP/TP/1TkmTWrFmtx3r16pVLLrkkSfLiiy8mSVatWpUkueaaa9KrV6/WuhtuuCG9evXKgw8+2Pr61atX5+DBg6mrq2sN00ly9dVXZ9CgQW1qAQAAoLN0aaAeNmxYkrdWlX/Tzp07kyTDhw9PkmzatCknnnhifvd3f7dN3SmnnJLq6ups3Lix9VjL/580aVKb2n79+mX8+PHZvHlz9u7d27kTAQAA4JjXpYF61qxZOf7447N06dI8//zzeeONN7Jhw4b81V/9VQYPHpxZs2Zl//79+eUvf5mPfOQjHV5j5MiR2bNnT379618nSV555ZWcfPLJGTRoUIe1SbJ169bf3qQAAAA4JnXp71CfeeaZ+bu/+7vccMMN+cxnPtN6/NRTT813v/vdnHbaafnVr36VJBk8eHCH12g5vnfv3gwfPjwNDQ057bTT3rF23759RzXuESM6HssHVU+bT0/QU3oycGC/7h5Cp+lJc+kJ9KNrvZfPpJ7yudWT6Ell0Y/KoyeVpyf0pEtXqOvr6/PNb34zu3btyvTp03PllVempqYmr732Wr7yla9kz549rTt99+3bt8NrtBxvampK8tbjtd5rLQAAAHSWLl2hvvHGG/PjH/84t956az71qU+1Hl+5cmWWLl2aL3/5y7n55puT5IjPm255DNaAAQOSJP3793/PtaV27eoZv4Pd8g1QT5lPT9DTetLY+MH/8qplJbQnzKUn0I/u8U6fST3tc6sn0JPKoh+VR08qTyX2pHS1vMtWqH/5y1/m2WefzaRJk9qE6SSZP39+Tj/99DzxxBM5/vjj07t37yPept2ywVjL7dxDhgw54qZjb68FAACAztJlgfoXv/hFkmTMmDEdnh87dmwOHz6cX/3qVzn11FOzffv2Duu2b9+eE088sXXH8Orq6tTX1+fNN99sV7tjx4707t07o0aN6qRZAAAAwFu6LFCffPLJSZJt27Z1eP7f/u3f0qtXr5x00kmZOHFidu3a1W537p07d+bf/u3fMn78+NZjEydOzOHDh7Np06Y2tU1NTXnxxRdz+umnd7gDOAAAAByNLgvUVVVV+f3f//0899xzefLJJ9uce/DBB7N58+Z87GMfy7Bhw1JbW5skufXWW3P48OEkSXNzc775zW+mubk5c+bMaX3tzJkz06dPn9x+++2tvzOdJHfeeWf27dvXphYAAAA6S5duSvb1r389l19+ea699tpMnz49o0ePzv/7f/8vzzzzTEaMGNG6Idk555yTT33qU/mHf/iHzJkzJ5MnT84LL7yQTZs25YILLsjHP/7x1muOGTMmV155Ze6+++7U1tZm+vTpeemll7J+/fqcffbZufTSS7tyigAAABwj+ixevHhxV73ZySefnD/6oz/Knj17smnTpvzf//t/88Ybb+S//tf/mr/+67/Oqaee2lp7/vnn57jjjssLL7yQH/7wh+nTp08++9nP5ktf+lKOO67t9wBTp07N8OHD88///M/5/ve/nzfffDOzZs3KkiVLcsIJJxz1uF9/ff+7F30AtOyW21Pm0xP0tJ5sfmV3dw/hqPXt+9bny4EDh7p5JCT60V3GjTrxiOd62udWT6AnlUU/Ko+eVJ5K7EnLmN6vXs3Nzc2dPJYep5K2cz8albg9/bGup/Vk3TMvd/cQjprHNFUW/egeted2vIFo0vM+t3oCPaks+lF59KTyVGJPKv6xWQAAANCTCNQAAABQQKAGAACAAgI1AAAAFBCoAQAAoIBADQAAAAUEagAAACggUAMAAEABgRoAAAAKCNQAAABQQKAGAACAAgI1AAAAFBCoAQAAoIBADQAAAAUEagAAACggUAMAAECB47p7AABAZVn3zMtHPDdwYL8kSWNjU1cN5wOp9twx3T0EALqAFWoAAAAoIFADAABAAYEaAAAACgjUAAAAUECgBgAAgAICNQAAABQQqAEAAKCAQA0AAAAFBGoAAAAoIFADAABAAYEaAAAACgjUAAAAUECgBgAAgAICNQAAABQQqAEAAKCAQA0AAAAFBGoAAAAoIFADAABAAYEaAAAACgjUAAAAUECgBgAAgAICNQAAABQQqAEAAKCAQA0AAAAFBGoAAAAoIFADAABAAYEaAAAACgjUAAAAUECgBgAAgAICNQAAABQQqAEAAKCAQA0AAAAFBGoAAAAoIFADAABAAYEaAAAACgjUAAAAUECgBgAAgAICNQAAABQQqAEAAKCAQA0AAAAFBGoAAAAoIFADAABAAYEaAAAACgjUAAAAUECgBgAAgAICNQAAABQQqAEAAKCAQA0AAAAFBGoAAAAoIFADAABAgW4J1H//93+f2bNn5w//8A/zsY99LNddd122bt3arm7dunWpra3N+PHjc95552Xp0qVpbGzs8Jrr16/PnDlzMmHChEydOjU33XRT6uvrf9tTAQAA4BjV5YH61ltvzYIFC7J379585jOfSU1NTZ588snMmTMn27dvb6276667snDhwhw+fDjz5s3LuHHjsnLlylx11VXZv39/m2s++uijqaurS319febOnZspU6bk4YcfzmWXXZY9e/Z09RQBAAA4BhzXlW/2j//4j7nrrrtSU1OTu+++O/3790+SfPKTn8wXvvCF/A75IcoAACAASURBVO3f/m2WLl2a1157LcuWLcuECRNy77335vjjj0+S3HbbbVm+fHkeeOCBzJs3L0nS2NiYJUuWpKqqKuvWrcugQYOSJNOmTcuiRYtyxx13ZOHChV05TQAAAI4BXbpCvWrVqiTJ1772tdYwnSR/9Ed/lDlz5uQjH/lIkmT16tU5ePBg6urqWsN0klx99dUZNGhQHnzwwdZjjz32WBoaGjJ//vzWMJ0ks2fPzujRo7N27docOnTotz01AAAAjjFdGqi///3v53d/93czevTodue+9rWv5b/9t/+WJNm4cWOSZNKkSW1q+vXrl/Hjx2fz5s3Zu3dvm9rJkye3u2ZNTU0aGhqyZcuWTp0HAAAAdFmgrq+vz69//et89KMfzc9//vNcc801+c//+T9n4sSJue666/Lqq6+21r7yyis5+eST26w4txg5cmSStG5i1vK6qqqqdrWnnXZam1oAAADoLF32O9S/+tWvkiQ7d+7MJZdcklGjRmXWrFnZunVrvve972XTpk158MEHM3LkyDQ0NLSG4bcbPHhwkmTfvn1Jkt27d6dv375tbiFv0RLIW2pLjRgx+KheX2l62nx6gp7Sk4ED+3X3EDpNT5pLT6AflUdP3ll3fK73lJ8lPYV+VB49qTw9oSddtkL9+uuvJ3nrFu0ZM2ZkzZo1+dKXvpRvfetb+fM///PU19fn61//epLk4MGD6du3b4fXaTne1NT0vmsBAACgs3TZCnXv3m9l9z59+uSmm25Knz59Ws/9yZ/8Sb7zne/k6aefzhtvvJH+/fvnwIEDHV6n5ZFZAwYMSJL3VVtq1669R/X6StHyDVBPmU9P0NN60tj4wf/yqmXVrSfMpSfQj8qjJ+9NV36u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EKgBAACggEANAAAABezyDQDQybryyRE9+YkRteeO6e4hALwjK9QAAABQQKAGAACAAgI1AAAAFBCoAQAAoIBADQAAAAUEagAAACggUAMAAEABgRoAAAAKCNQAAABQQKAGAACAAgI1AAAAFBCoAQAAoIBADQAAAAUEagAAACggUAMAAEABgRoAAAAKCNQAAABQQKAGAACAAgI1AAAAFBCoAQAAoIBADQAAAAUEagAAACggUAMAAEABgRoAAAAKCNQAAABQQKAGAACAAsd19Rvu2rUrf/M3f5Onn3469fX1GTp0aKZOnZovfOELqaqqalO7bt26rFy5Mtu2bcuQIUNy4YUX5rrrrsvAgQPbXXf9+vW544478q//+q/p379/pk+fnhtvvDEnnXRSV00NAACAY0iXrlDv2rUrl1xySVavXp2xY8fm8ssvzx/8wR/k0UcfzezZs7Nt27bW2rvuuisLFy7M4cOHM2/evIwbNy4rV67MVVddlf3797e57qOPPpq6urrU19dn7ty5mTJlSh5++OFcdtll2bNnT1dOEQAAgGNEl65Q/83f/E1+8Ytf5Itf/GKuuOKK1uN///d/nwULFuQb3/hG7rzzzrz22mtZtmxZJkyYkHvvvTfHH398kuS2227L8uXL88ADD2TevHlJksbGxixZsiRVVVVZt25dBg0alCSZNm1aFi1alDvuuCMLFy7symkCAABwDOjSFeonn3wyw4cPz+c+97k2xy+66KJ85CMfyQ9+8IMcPnw4q1evzsGDB1NXV9cappPk6quvzqBBg/Lggw+2HnvsscfS0NCQ+fPnt4bpJJk9e3ZGjx6dtWvX5tChQ7/9yQEAAHBM6bJAfejQodTV1eWaa65J797t37Zv3745cOBADhw4kI0bNyZJJk2a1KamX79+GT9+fDZv3py9e/cmSWvt5MmT212zpqYmDQ0N2bJlS2dPBwAAgGNcl93y3adPn3Yr0y1+/vOf5+WXX85HPvKR9OvXL6+88kpOPvnkNivOLUaOHJkk2bp1a84666y8+uqrSdJuQ7MkOe2001prx40bVzz2ESMGF7+2EvW0+XSWgQP7HZPvTcf0pLLoR+XRk8rTE3vyQf5vlg/y2HsqPak8PaEn3f7YrMOHD2fJkiU5fPhwLr300iRJQ0NDBg/u+A+35fi+ffuSJLt3707fvn3Tv3//drUtgbylFgAAADpLlz826zc1NzfnK1/5Sp599tmceeaZrSvYBw8eTN++fTt8Tcvxpqam911bateuvUf1+krR8g1QT5lPZ2tsPLq/JyVaVhO6473pmJ5UFv2oPHpSeXpyTz6I/83iv7cqj55UnkrsSelqebetUB88eDA33XRTHnzwwVRVVWX58uWtAbh///45cOBAh69reWTWgAED3nctAAAAdJZuWaF+44038oUvfCFPP/10qqur83d/93c55ZRTWs8PGTKkddOxt2s53nLr95AhQ9LU1JT9+/e3W6luudX7SLePAwAAQKkuX6H+93//93zuc5/L008/nd/7vd/L/fffn1NPPbVNTXV1derr6/Pmm2+2e/2OHTvSu3fvjBo1qrU2SbZv396utuXY6NGjO3kWAAAAHOu6NFA3NTWlrq4uP/nJT1JTU5N77703J510Uru6iRMn5vDhw9m0aVO717/44os5/fTTWzccmzhxYpL/eHzWb9qwYUMGDx6csWPH/hZmAwAAwLGsSwP1N7/5zbzwwguZMGFC7r777g4fi5UkM2fOTJ8+fXL77be3/h50ktx5553Zt29f5syZ03psxowZGThwYFasWJGGhobW42vWrMm2bdtyySWXdPjcawAAADgaXfY71Lt27cqqVauSJGPGjMndd9/dYd2f/umfZsyYMbnyyitz9913p7a2NtOnT89LL72U9evX5+yzz259vFaSDBs2LAsWLMjixYtTW1ubCy+8MDt37szjjz+e6urq1NXVdcn8AAAAOLZ0WaD+yU9+0rob90MPPXTEus997nPp169fbrzxxnz4wx/O/fffn3vuuef/t3fvcVHV+R/H36MJXgMttSQNKwdTUhGFNbxEXttErXS9rJqWaQ9xLdMuZrrtZttumq63Hrq6ZULec9XVLq6FZmpeNi0vqauirqVEKKuAAsOc3x/+5uTIIMMBZQZez8ejR/U9H06H7/ucnM+cm2rXrq0hQ4Zo1KhR+R4+1r9/fwUFBWnBggX68MMPFRQUpF69emnMmDEKDg6+ob8XAAAAAKB8shmGYZT2Rvg6X3o/WnH44vvefMnqLcdv+n+zLL871F+RiW8hD99DJr6nLGfSq909pb0JRcbnLd9DJr7HFzPxu/dQAwAAAADgz2ioAQAAAACwgIYaAAAAAAALaKgBAAAAALCAhhoAAAAAAAtoqAEAAAAAsICGGgAAAAAAC2ioAQAAAACwgIYaAAAAAAALaKgBAAAAALCAhhoAAAAAAAtoqAEAAAAAsICGGgAAAAAAC2ioAQAAAACwgIYaAAAAAAALaKgBAAAAALCAhhoAAAAAAAtoqAEAAAAAsICGGgAAAAAAC2ioAQAAAACwgIYaAAAAAAALaKgBAAAAALCAhhoAAAAAAAtoqAEAAAAAsICGGgAAAAAAC2ioAQAAAACwgIYaAAAAAAALaKgBAAAAALCAhhoAAAAAAAtoqAEAAAAAsICGGgAAAAAAC2ioAQAAAACwgIYaAAAAAAALaKgBAAAAALCAhhoAAAAAAAtoqAEAAAAAsICGGgAAAAAAC2ioAQAAAACwgIYaAAAAAAALbintDQAAAAA8Wb3leGlvQpFVqxYoScrMzC7lLbmiV7t7SnsTgDKNM9QAAAAAAFhAQw0AAAAAgAU01AAAAAAAWEBDDQAAAACABTTUAAAAAABYQEMNAAAAAIAFNNQAAAAAAFhAQw0AAAAAgAU01AAAAAAAWEBDDQAAAACABbeU9gag+FZvOe5VXbVqgZKkzMzsG7k5AAAAAFAucIYaAAAAAAALaKgBAAAAALCAhhoAAAAAAAtoqAEAAAAAsICGGgAAAAAAC2ioAQAAAACwgIYaAAAAAAALaKgBAAAAALCAhhoAAAAAAAtoqAEAAAAAsICGGgAAAAAAC2ioAQAAAACwgIYaAAAAAAALaKgBAAAAALCAhhoAAAAAAAtoqAEAAAAAsOCW0t6AkuRwOJSYmKjly5fr9OnTql27th5//HENHz5clSpVKu3NAwAAAG6q1VuOl/YmlLpq1QIlSZmZ2ZZ+vle7e0pyc1DGlKkz1H/84x/11ltvKTg4WIMHD1bdunU1c+ZMjR07trQ3DQAAAABQxpSZM9TffPONli1bpq5du2rGjBmy2WwyDEOvvPKKVq9eraSkJMXGxpb2ZgIAAAAAyogyc4b6ww8/lCSNGjVKNptNkmSz2fTCCy/IZrNpxYoVpbl5AAAAAIAypsw01Lt371bNmjVlt9vdxuvWravQ0FDt2rWrlLYMAAAAAFAWlYlLvnNycnT27Fk1b97c4/KQkBAlJyfr3LlzqlWr1k3eOgAAAAD+ige7FV9ZfrBbmWio09PTJUk1atTwuNw1fvHiRUsNde3antfrK1xPLrxR9bjxyMT3kIlvIQ/fQya+h0x8C3n4HjIpPQX1U77eZ3mjTDTUDodDkhQQEOBxuWs8O9vao/J93YCujUt7EwAAAACg3CkT91BXrlxZkpSbm+txeU5OjiSpSpUqN22bAAAAAABlW5loqKtXr64KFSooIyPD4/KLFy9KKviScAAAAAAAiqpMNNQBAQGqV6+eTp8+7XH56dOnVbNmTQUHB9/kLQMAAAAAlFVloqGWpMjISKWmpio5OdltPCUlRSdPnlSLFi1KacsAAAAAAGVRmWmoe/XqJUmaPn26nE6nJMkwDE2bNk2GYahv376luXkAAAAAgDLGZhiGUdobUVLGjBmjjz/+WM2aNVN0dLT27Nmj3bt3q2vXrpoxY4ZsNltpbyIAAAAAoIwoUw11bm6u/va3v+kf//iHUlJSVK9ePfXo0UPPPPNMga/UAgAAAADAijLVUAMAAAAAcLOUmXuoAQAAAAC4mWioAQAAAACwgIYaAAAAAAALaKgBAAAAALCAhhoAAAAAAAtoqEtZSkqKIiMjtXDhwnzLVqxYobCwMI9//eY3v8lXv2nTJvXt21cRERFq06aNXn31VaWlpXn87+7Zs0dDhgxR69atFRUVpdGjR+u///2vx9qjR49q5MiRatOmjSIjI/X000/rwIEDHmvPnDmjF198Ue3atVNERIQGDBigbdu2eT8hPuB6mUjSl19+qUGDBqlly5aKjo7W008/re+++85jLZkUX0F5PPzwwwUeH66/Vq1a5fYz5FEyrneMXLp0SVOnTtXDDz+s8PBwtW3bVpMmTdK5c+c8rmv16tXq1auXWrRoofbt2+utt95SZmamx1pfyM9XXS+TzMxMM5NmzZqpW7dumjdvnrKzsz2uyxfm2V+Pk9TUVE2aNEkdOnRQeHi4YmJiNG7cOI9z4m/7fnnIxCUrK0uxsbF68803C6whE2u8zSMjI0Nvv/22OnfurPDwcEVHR2vkyJH6/vvvPa6XPKzzNpOsrCzNnDlT3bp1U7NmzdSpUydNnz5dWVlZHtdbnjLhtVmlKDMzU0OHDtW3336r8ePHa8iQIW7LJ0+erISEBD3zzDMKDAx0W3bHHXeoT58+5r+vW7dOY8eOVf369dWlSxedOXNGn376qe666y599NFHuvXWW83aXbt2aejQoQoKCtKjjz6qixcvat26dapatao++ugj3XXXXWbtsWPH1K9fPzmdTsXFxclms2nt2rXKzc1VYmKimjVrZtb+/PPP6tOnj1JTUxUXF6caNWpo/fr1SktL05w5c9SxY8cSnsGSV1gmy5cv18SJE1WnTh1169ZNGRkZWr9+vZxOpxYvXuw2H2RSfNfLY+HChbp48WK+n7l8+bLee+89BQQEaOXKlWrUqJEk8igp18vE6XRq8ODB2rVrl8LDwxUVFaUjR47oq6++UmhoqFauXKkaNWqY9fPmzdO0adMUFham9u3b68iRI9q8ebMiIiK0aNEiBQQEmLW+kJ+vul4mly5d0sCBA7V//341atRIDz74oE6dOqWkpCRFRUVp/vz5qly5slnvC/Psr8dJamqq+vTpozNnzigmJkZhYWFKTk7Wpk2bFBQUpGXLlik0NFSS/+375SETF4fDodGjR+vzzz/X4MGDNWHChHzrJRNrvM0jKytL/fv316FDhxQREaGIiAidPXtWGzZsUMWKFfX+++8rMjLSXC95WOdtJg6HQ0OHDtXOnTsVHR2tpk2b6vDhw9q6dauaNm2qJUuWuPUq5S4TA6Xi9OnTxmOPPWbY7XbDbrcb77//fr6agQMHGlFRUYWuKyMjw4iKijI6duxoXLx40RxfsWKFYbfbjT//+c/mmNPpNLp27Wq0atXKOHPmjDm+bds2IywszPjd737ntu6hQ4caTZo0MQ4ePGiOHT582GjevLnx+OOPu9W+9tprht1uN7744gtz7OzZs0ZMTIzRrl07Izs7u9DfpTQVlskPP/xgNGvWzHjkkUeMtLQ0c3zv3r1G48aNjUGDBpljZFJ83hwjnrz++uuG3W43li5dao6RR8koLJNPP/3UsNvtRnx8vJGXl2eOv/POO4bdbjdmzZpljv3www9GkyZNjL59+xo5OTnm+F//+lfDbrcbCQkJ5piv5OeLCstk5syZZiZX71+JiYmG3W43Zs6caY75yjz763EyceJEw263G++9957b+Jo1awy73W6MGDHCMAz/3PfLeiYu58+fN4YOHWoeT5MnT863TjKxzts85s2bZ9jtduONN95wq9uxY4dx//33G927dzfHyKN4vM1k6dKlht1uN/70pz+51U2dOtWw2+1GYmKiOVYeM+GS71KwcOFCxcXF6dChQ/rVr35VYN2RI0dkt9sLXd/69euVnp6uIUOGqHr16uZ479691bBhQ61atUp5eXmSpG3btik5OVm9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\n",
+ "text/plain": [
+ "| \n", + " | A | \n", + "B | \n", + "C | \n", + "D | \n", + "E | \n", + "F | \n", + "G | \n", + "H | \n", + "I | \n", + "J | \n", + "
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | \n", + "0.305239 | \n", + "0.231272 | \n", + "0.088222 | \n", + "0.251882 | \n", + "0.385132 | \n", + "0.234758 | \n", + "0.645410 | \n", + "0.986175 | \n", + "0.760495 | \n", + "0.491813 | \n", + "
| 1 | \n", + "0.894179 | \n", + "0.129102 | \n", + "0.520792 | \n", + "0.780366 | \n", + "0.785802 | \n", + "0.368216 | \n", + "0.207315 | \n", + "0.248793 | \n", + "0.587673 | \n", + "0.763330 | \n", + "
| 2 | \n", + "0.306956 | \n", + "0.049282 | \n", + "0.675463 | \n", + "0.113234 | \n", + "0.869604 | \n", + "0.930263 | \n", + "0.696827 | \n", + "0.397656 | \n", + "0.459233 | \n", + "0.064965 | \n", + "
| 3 | \n", + "0.272259 | \n", + "0.779780 | \n", + "0.380540 | \n", + "0.685579 | \n", + "0.785072 | \n", + "0.976008 | \n", + "0.412942 | \n", + "0.512427 | \n", + "0.956594 | \n", + "0.887955 | \n", + "
| 4 | \n", + "0.622153 | \n", + "0.963447 | \n", + "0.755817 | \n", + "0.541017 | \n", + "0.254235 | \n", + "0.708141 | \n", + "0.150924 | \n", + "0.664176 | \n", + "0.261850 | \n", + "0.161177 | \n", + "
| 5 | \n", + "0.811146 | \n", + "0.476762 | \n", + "0.855972 | \n", + "0.305416 | \n", + "0.808352 | \n", + "0.544968 | \n", + "0.843353 | \n", + "0.562328 | \n", + "0.826649 | \n", + "0.036099 | \n", + "
| 6 | \n", + "0.523588 | \n", + "0.727435 | \n", + "0.659603 | \n", + "0.762771 | \n", + "0.462791 | \n", + "0.180671 | \n", + "0.026311 | \n", + "0.011348 | \n", + "0.820640 | \n", + "0.175180 | \n", + "
| 7 | \n", + "0.290624 | \n", + "0.776585 | \n", + "0.648164 | \n", + "0.913340 | \n", + "0.240606 | \n", + "0.354553 | \n", + "0.271786 | \n", + "0.248880 | \n", + "0.084472 | \n", + "0.741984 | \n", + "
| 8 | \n", + "0.526691 | \n", + "0.020449 | \n", + "0.372602 | \n", + "0.057064 | \n", + "0.331893 | \n", + "0.809467 | \n", + "0.815766 | \n", + "0.421695 | \n", + "0.876327 | \n", + "0.676441 | \n", + "
| 9 | \n", + "0.469389 | \n", + "0.373859 | \n", + "0.917139 | \n", + "0.301419 | \n", + "0.361257 | \n", + "0.166470 | \n", + "0.001263 | \n", + "0.745675 | \n", + "0.487949 | \n", + "0.341857 | \n", + "
| 10 | \n", + "0.586595 | \n", + "0.103862 | \n", + "0.542455 | \n", + "0.172138 | \n", + "0.231164 | \n", + "0.621282 | \n", + "0.303060 | \n", + "0.199532 | \n", + "0.592424 | \n", + "0.846125 | \n", + "
| 11 | \n", + "0.874637 | \n", + "0.765251 | \n", + "0.446922 | \n", + "0.863143 | \n", + "0.934134 | \n", + "0.781621 | \n", + "0.578874 | \n", + "0.161245 | \n", + "0.364697 | \n", + "0.604686 | \n", + "
| 12 | \n", + "0.372582 | \n", + "0.014192 | \n", + "0.141197 | \n", + "0.718072 | \n", + "0.985635 | \n", + "0.727378 | \n", + "0.832513 | \n", + "0.394161 | \n", + "0.892131 | \n", + "0.595044 | \n", + "
| 13 | \n", + "0.747853 | \n", + "0.361451 | \n", + "0.307679 | \n", + "0.430487 | \n", + "0.333176 | \n", + "0.512498 | \n", + "0.421828 | \n", + "0.602016 | \n", + "0.756884 | \n", + "0.319003 | \n", + "
| 14 | \n", + "0.806012 | \n", + "0.289871 | \n", + "0.438636 | \n", + "0.135046 | \n", + "0.456787 | \n", + "0.491738 | \n", + "0.091800 | \n", + "0.136814 | \n", + "0.859572 | \n", + "0.175451 | \n", + "
| 15 | \n", + "0.633796 | \n", + "0.121392 | \n", + "0.551617 | \n", + "0.938901 | \n", + "0.037063 | \n", + "0.551676 | \n", + "0.989032 | \n", + "0.429235 | \n", + "0.139587 | \n", + "0.049697 | \n", + "
| 16 | \n", + "0.369000 | \n", + "0.534016 | \n", + "0.841040 | \n", + "0.079688 | \n", + "0.757663 | \n", + "0.511047 | \n", + "0.485882 | \n", + "0.118199 | \n", + "0.556479 | \n", + "0.377192 | \n", + "
| 17 | \n", + "0.922850 | \n", + "0.980879 | \n", + "0.299093 | \n", + "0.918864 | \n", + "0.870944 | \n", + "0.175901 | \n", + "0.749300 | \n", + "0.169334 | \n", + "0.537206 | \n", + "0.577845 | \n", + "
| 18 | \n", + "0.585918 | \n", + "0.606926 | \n", + "0.210228 | \n", + "0.821542 | \n", + "0.206155 | \n", + "0.557342 | \n", + "0.548108 | \n", + "0.521981 | \n", + "0.054173 | \n", + "0.617419 | \n", + "
| 19 | \n", + "0.042375 | \n", + "0.285725 | \n", + "0.220813 | \n", + "0.964579 | \n", + "0.865262 | \n", + "0.464721 | \n", + "0.220354 | \n", + "0.071457 | \n", + "0.548230 | \n", + "0.684320 | \n", + "
| \n", + " | Name | \n", + "Sex | \n", + "Job | \n", + "Job Status | \n", + "Age | \n", + "weight | \n", + "Account | \n", + "Transfer | \n", + "Count | \n", + "Religion | \n", + "
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | \n", + "Gbenga | \n", + "male | \n", + "Teacher | \n", + "yes | \n", + "20 | \n", + "0.637354 | \n", + "Yes | \n", + "0 | \n", + "0 | \n", + "Christian | \n", + "
| 1 | \n", + "Femi | \n", + "female | \n", + "Banker | \n", + "yes | \n", + "24 | \n", + "0.607694 | \n", + "No | \n", + "1 | \n", + "1 | \n", + "Muslim | \n", + "
| 2 | \n", + "Ade | \n", + "male | \n", + "Footballer | \n", + "yes | \n", + "28 | \n", + "0.040372 | \n", + "Yes | \n", + "0 | \n", + "2 | \n", + "Christian | \n", + "
| 3 | \n", + "Bose | \n", + "female | \n", + "Trader | \n", + "yes | \n", + "32 | \n", + "0.999901 | \n", + "No | \n", + "1 | \n", + "3 | \n", + "Muslim | \n", + "
| 4 | \n", + "Bolu | \n", + "male | \n", + "Teacher | \n", + "yes | \n", + "36 | \n", + "0.239623 | \n", + "Yes | \n", + "0 | \n", + "4 | \n", + "Christian | \n", + "
| 5 | \n", + "Ayo | \n", + "female | \n", + "Banker | \n", + "yes | \n", + "40 | \n", + "0.571719 | \n", + "No | \n", + "1 | \n", + "5 | \n", + "Muslim | \n", + "
| 6 | \n", + "David | \n", + "male | \n", + "Footballer | \n", + "yes | \n", + "44 | \n", + "0.251429 | \n", + "Yes | \n", + "0 | \n", + "6 | \n", + "Christian | \n", + "
| 7 | \n", + "Esther | \n", + "female | \n", + "Trader | \n", + "yes | \n", + "48 | \n", + "0.307864 | \n", + "No | \n", + "1 | \n", + "7 | \n", + "Muslim | \n", + "
| 8 | \n", + "Ifeoma | \n", + "male | \n", + "Teacher | \n", + "yes | \n", + "52 | \n", + "0.714834 | \n", + "Yes | \n", + "0 | \n", + "8 | \n", + "Christian | \n", + "
| 9 | \n", + "Akeem | \n", + "female | \n", + "Banker | \n", + "yes | \n", + "56 | \n", + "0.409580 | \n", + "No | \n", + "1 | \n", + "9 | \n", + "Muslim | \n", + "
| 10 | \n", + "Wale | \n", + "male | \n", + "Footballer | \n", + "yes | \n", + "60 | \n", + "0.338789 | \n", + "Yes | \n", + "0 | \n", + "10 | \n", + "Christian | \n", + "
| 11 | \n", + "Abeeb | \n", + "female | \n", + "Trader | \n", + "yes | \n", + "64 | \n", + "0.460655 | \n", + "No | \n", + "1 | \n", + "11 | \n", + "Muslim | \n", + "
| 12 | \n", + "Muraina | \n", + "male | \n", + "Teacher | \n", + "yes | \n", + "68 | \n", + "0.893463 | \n", + "Yes | \n", + "0 | \n", + "12 | \n", + "Christian | \n", + "
| 13 | \n", + "Segun | \n", + "female | \n", + "Banker | \n", + "yes | \n", + "72 | \n", + "0.750401 | \n", + "No | \n", + "1 | \n", + "13 | \n", + "Muslim | \n", + "
| 14 | \n", + "Tosin | \n", + "male | \n", + "Footballer | \n", + "yes | \n", + "76 | \n", + "0.150023 | \n", + "Yes | \n", + "0 | \n", + "14 | \n", + "Christian | \n", + "
| 15 | \n", + "Siju | \n", + "female | \n", + "Trader | \n", + "yes | \n", + "80 | \n", + "0.503903 | \n", + "No | \n", + "1 | \n", + "15 | \n", + "Muslim | \n", + "
| 16 | \n", + "Deji | \n", + "male | \n", + "Teacher | \n", + "yes | \n", + "84 | \n", + "0.853731 | \n", + "Yes | \n", + "0 | \n", + "16 | \n", + "Christian | \n", + "
| 17 | \n", + "Blessing | \n", + "female | \n", + "Banker | \n", + "yes | \n", + "88 | \n", + "0.880703 | \n", + "No | \n", + "1 | \n", + "17 | \n", + "Muslim | \n", + "
| 18 | \n", + "Funmi | \n", + "male | \n", + "Footballer | \n", + "yes | \n", + "92 | \n", + "0.840192 | \n", + "Yes | \n", + "0 | \n", + "18 | \n", + "Christian | \n", + "
| 19 | \n", + "Yinka | \n", + "female | \n", + "Trader | \n", + "yes | \n", + "96 | \n", + "0.922895 | \n", + "No | \n", + "1 | \n", + "19 | \n", + "Muslim | \n", + "
| \n", + " | A | \n", + "B | \n", + "C | \n", + "D | \n", + "E | \n", + "F | \n", + "G | \n", + "H | \n", + "I | \n", + "J | \n", + "
|---|---|---|---|---|---|---|---|---|---|---|
| count | \n", + "20.000000 | \n", + "20.000000 | \n", + "20.000000 | \n", + "20.000000 | \n", + "20.000000 | \n", + "20.000000 | \n", + "20.000000 | \n", + "20.000000 | \n", + "20.000000 | \n", + "20.000000 | \n", + "
| mean | \n", + "0.548192 | \n", + "0.429577 | \n", + "0.493700 | \n", + "0.537727 | \n", + "0.548136 | \n", + "0.533436 | \n", + "0.464633 | \n", + "0.380156 | \n", + "0.571163 | \n", + "0.459379 | \n", + "
| std | \n", + "0.245335 | \n", + "0.319636 | \n", + "0.244889 | \n", + "0.332432 | \n", + "0.299334 | \n", + "0.241799 | \n", + "0.299394 | \n", + "0.253898 | \n", + "0.278767 | \n", + "0.278714 | \n", + "
| min | \n", + "0.042375 | \n", + "0.014192 | \n", + "0.088222 | \n", + "0.057064 | \n", + "0.037063 | \n", + "0.166470 | \n", + "0.001263 | \n", + "0.011348 | \n", + "0.054173 | \n", + "0.036099 | \n", + "
| 25% | \n", + "0.353489 | \n", + "0.127174 | \n", + "0.305532 | \n", + "0.231946 | \n", + "0.312478 | \n", + "0.364800 | \n", + "0.217095 | \n", + "0.167312 | \n", + "0.435599 | \n", + "0.175383 | \n", + "
| 50% | \n", + "0.556304 | \n", + "0.367655 | \n", + "0.483857 | \n", + "0.613298 | \n", + "0.459789 | \n", + "0.528733 | \n", + "0.453855 | \n", + "0.395908 | \n", + "0.572076 | \n", + "0.534829 | \n", + "
| 75% | \n", + "0.762393 | \n", + "0.736889 | \n", + "0.663568 | \n", + "0.831942 | \n", + "0.822579 | \n", + "0.712950 | \n", + "0.709945 | \n", + "0.532068 | \n", + "0.822142 | \n", + "0.678411 | \n", + "
| max | \n", + "0.922850 | \n", + "0.980879 | \n", + "0.917139 | \n", + "0.964579 | \n", + "0.985635 | \n", + "0.976008 | \n", + "0.989032 | \n", + "0.986175 | \n", + "0.956594 | \n", + "0.887955 | \n", + "
| \n", + " | Age | \n", + "weight | \n", + "Transfer | \n", + "Count | \n", + "
|---|---|---|---|---|
| count | \n", + "20.000000 | \n", + "20.000000 | \n", + "20.000000 | \n", + "20.00000 | \n", + "
| mean | \n", + "58.000000 | \n", + "0.568756 | \n", + "0.500000 | \n", + "9.50000 | \n", + "
| std | \n", + "23.664319 | \n", + "0.286102 | \n", + "0.512989 | \n", + "5.91608 | \n", + "
| min | \n", + "20.000000 | \n", + "0.040372 | \n", + "0.000000 | \n", + "0.00000 | \n", + "
| 25% | \n", + "39.000000 | \n", + "0.331058 | \n", + "0.000000 | \n", + "4.75000 | \n", + "
| 50% | \n", + "58.000000 | \n", + "0.589706 | \n", + "0.500000 | \n", + "9.50000 | \n", + "
| 75% | \n", + "77.000000 | \n", + "0.843577 | \n", + "1.000000 | \n", + "14.25000 | \n", + "
| max | \n", + "96.000000 | \n", + "0.999901 | \n", + "1.000000 | \n", + "19.00000 | \n", + "
\n",
+ "\n",
+ "Fill in the app creation page with a unique name, a website name (use a placeholder website if you don’t have one), and a project description. Accept the terms and conditions and proceed to the next page.\n",
+ "\n",
+ "Once your project has been created, click on the “Keys and Access Tokens” tab. You should now be able to see your consumer secret and consumer key.\n",
+ "\n",
+ "
\n",
+ "\n",
+ "You’ll also need a pair of access tokens. Scroll down and request those tokens. The page should refresh, and you should now have an access token and access token secret.\n",
+ "\n",
+ "
\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Import necessary modules"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 81,
+ "metadata": {
+ "colab": {},
+ "colab_type": "code",
+ "id": "UI2fIQFxrNLB",
+ "run_control": {
+ "frozen": false,
+ "read_only": false
+ }
+ },
+ "outputs": [],
+ "source": [
+ "import sys\n",
+ "import os\n",
+ "import json\n",
+ "import re\n",
+ "import string\n",
+ "import pandas as pd\n",
+ "from pandas.io.json import json_normalize\n",
+ "import matplotlib.pyplot as plt"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {
+ "colab": {},
+ "colab_type": "code",
+ "id": "3pf5Xapqrq0M"
+ },
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "[nltk_data] Error loading punkt: | \n", + " | id | \n", + "id_str | \n", + "name | \n", + "screen_name | \n", + "location | \n", + "description | \n", + "url | \n", + "protected | \n", + "followers_count | \n", + "friends_count | \n", + "... | \n", + "status.place.place_type | \n", + "status.place.name | \n", + "status.place.full_name | \n", + "status.place.country_code | \n", + "status.place.country | \n", + "status.place.contained_within | \n", + "status.place.bounding_box.type | \n", + "status.place.bounding_box.coordinates | \n", + "status.retweeted_status.entities.media | \n", + "status.retweeted_status.extended_entities.media | \n", + "
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | \n", + "305125998 | \n", + "305125998 | \n", + "Jeffrey Gettleman | \n", + "gettleman | \n", + "New Delhi, India | \n", + "South Asia bureau chief for the New York Times... | \n", + "http://t.co/AYD1lbjVvB | \n", + "False | \n", + "25704 | \n", + "37 | \n", + "... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| 1 | \n", + "26475943 | \n", + "26475943 | \n", + "A24 Media | \n", + "a24media | \n", + "Golden Ivy Plaza, Karen, NBO | \n", + "Africa 24 produces compelling content that mak... | \n", + "https://t.co/5I7guDadfM | \n", + "False | \n", + "31285 | \n", + "3059 | \n", + "... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| 2 | \n", + "72013267 | \n", + "72013267 | \n", + "Scapegoat | \n", + "AndiMakinana | \n", + "Cape Town, South Africa | \n", + "In pursuit of scoops. I do not write headlines... | \n", + "https://t.co/pQLpRj9WO4 | \n", + "False | \n", + "101278 | \n", + "2838 | \n", + "... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| 3 | \n", + "625489039 | \n", + "625489039 | \n", + "Africa Check | \n", + "AfricaCheck | \n", + "\n", + " | Africa's first independent fact-checking websi... | \n", + "https://t.co/8bYLuvxpVN | \n", + "False | \n", + "68074 | \n", + "4592 | \n", + "... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| 4 | \n", + "401520924 | \n", + "401520924 | \n", + "James Copnall | \n", + "JamesCopnall | \n", + "\n", + " | BBC reporter + presenter. Author A Poisonous T... | \n", + "http://t.co/xrztQ2mzfH | \n", + "False | \n", + "21963 | \n", + "5050 | \n", + "... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| ... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "
| 88 | \n", + "117102398 | \n", + "117102398 | \n", + "Julius Sello Malema | \n", + "Julius_S_Malema | \n", + "Johannesburg, South Africa | \n", + "Commander in Chief of Economic Freedom Fighter... | \n", + "https://t.co/MrsRL5oNpK | \n", + "False | \n", + "3129686 | \n", + "652 | \n", + "... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| 89 | \n", + "14697575 | \n", + "14697575 | \n", + "News24 | \n", + "News24 | \n", + "South Africa | \n", + "South Africa's premier online news resource. F... | \n", + "https://t.co/TV9HgXREOi | \n", + "False | \n", + "3577999 | \n", + "631 | \n", + "... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| 90 | \n", + "1102508781781557248 | \n", + "1102508781781557248 | \n", + "jdwtweet | \n", + "SAPresident | \n", + "Miami, FL | \n", + "\n", + " | None | \n", + "False | \n", + "18 | \n", + "14 | \n", + "... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| 91 | \n", + "17962204 | \n", + "17962204 | \n", + "Gareth Cliff | \n", + "GarethCliff | \n", + "South Africa | \n", + "President of https://t.co/scMZ7lsVKF ⚜. Enquir... | \n", + "https://t.co/99Q8vPRprW | \n", + "False | \n", + "1974613 | \n", + "356 | \n", + "... | \n", + "city | \n", + "Pretoria | \n", + "Pretoria, South Africa | \n", + "ZA | \n", + "South Africa | \n", + "[] | \n", + "Polygon | \n", + "[[[27.9483035, -25.9157727], [28.4198285, -25.... | \n", + "NaN | \n", + "NaN | \n", + "
| 92 | \n", + "46335511 | \n", + "46335511 | \n", + "Trevor Noah | \n", + "Trevornoah | \n", + "New York, NY | \n", + "Comedian from South Africa. I was in the crowd... | \n", + "https://t.co/5zKr0YPMa5 | \n", + "False | \n", + "10808461 | \n", + "325 | \n", + "... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
93 rows × 123 columns
\n", + "| \n", + " | id | \n", + "id_str | \n", + "name | \n", + "screen_name | \n", + "location | \n", + "profile_location | \n", + "description | \n", + "url | \n", + "protected | \n", + "followers_count | \n", + "... | \n", + "profile_location.country_code | \n", + "profile_location.country | \n", + "profile_location.contained_within | \n", + "profile_location.bounding_box | \n", + "status.entities.media | \n", + "status.extended_entities.media | \n", + "status.retweeted_status.quoted_status_id | \n", + "status.retweeted_status.quoted_status_id_str | \n", + "status.quoted_status_id | \n", + "status.quoted_status_id_str | \n", + "
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | \n", + "2515899612 | \n", + "2515899612 | \n", + "Hage G. Geingob | \n", + "hagegeingob | \n", + "Namibia | \n", + "NaN | \n", + "President of the Republic of Namibia | \n", + "https://t.co/f5BbkeEYSL | \n", + "False | \n", + "192470 | \n", + "... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| 1 | \n", + "40839292 | \n", + "40839292 | \n", + "Presidency | South Africa 🇿🇦 | \n", + "PresidencyZA | \n", + "Pretoria, South Africa | \n", + "NaN | \n", + "This is the official Twitter page of The Presi... | \n", + "https://t.co/lw3QfCqSCq | \n", + "False | \n", + "1599341 | \n", + "... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| 2 | \n", + "1200316338 | \n", + "1200316338 | \n", + "Ministry of Health Zambia | \n", + "mohzambia | \n", + "Lusaka, Zambia | \n", + "NaN | \n", + "The Ministry aims to address and share ideas w... | \n", + "https://t.co/ShAx7bUDqc | \n", + "False | \n", + "7170 | \n", + "... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| 3 | \n", + "447895686 | \n", + "447895686 | \n", + "President of Zimbabwe | \n", + "edmnangagwa | \n", + "Zimbabwe | \n", + "NaN | \n", + "Official Twitter account of Emmerson Dambudzo ... | \n", + "None | \n", + "False | \n", + "546537 | \n", + "... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| 4 | \n", + "894266976499060736 | \n", + "894266976499060736 | \n", + "MinSantédj | \n", + "MinSantedj | \n", + "Djibouti | \n", + "NaN | \n", + "ORGANISME GOUVERNEMENTAL\\nSuivez toutes les ac... | \n", + "https://t.co/ZElb6lvXnU | \n", + "False | \n", + "2934 | \n", + "... | \n", + "\n", + " | \n", + " | [] | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| 5 | \n", + "438370063 | \n", + "438370063 | \n", + "Yemane G. Meskel | \n", + "hawelti | \n", + "Asmara; ERITREA | \n", + "NaN | \n", + "Minister of Information | \n", + "https://t.co/fSQjSLmk6t | \n", + "False | \n", + "66245 | \n", + "... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| 6 | \n", + "364830542 | \n", + "364830542 | \n", + "State House Kenya | \n", + "StateHouseKenya | \n", + "Nairobi | \n", + "NaN | \n", + "\n", + " | https://t.co/vReQnpRV2z | \n", + "False | \n", + "1104077 | \n", + "... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| 7 | \n", + "37601149 | \n", + "37601149 | \n", + "Paul Kagame | \n", + "PaulKagame | \n", + "Rwanda, Africa | \n", + "NaN | \n", + "President of the Republic of Rwanda, write to:... | \n", + "https://t.co/bfKOFZyOav | \n", + "False | \n", + "1984272 | \n", + "... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| 8 | \n", + "812627249446780928 | \n", + "812627249446780928 | \n", + "Mohamed Farmaajo | \n", + "M_Farmaajo | \n", + "Somalia | \n", + "NaN | \n", + "9th and the current President of Federal Repub... | \n", + "None | \n", + "False | \n", + "424425 | \n", + "... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| 9 | \n", + "868153335307698177 | \n", + "868153335307698177 | \n", + "South Sudan Government | \n", + "SouthSudanGov | \n", + "South Sudan | \n", + "NaN | \n", + "Official Twitter Account of the Revitalized Tr... | \n", + "None | \n", + "False | \n", + "2559 | \n", + "... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| 10 | \n", + "1164801318742982656 | \n", + "1164801318742982656 | \n", + "Abdalla Hamdok | \n", + "SudanPMHamdok | \n", + "Sudan | \n", + "NaN | \n", + "The official account of the Prime Minister of ... | \n", + "https://t.co/2dtCXDjTvv | \n", + "False | \n", + "371069 | \n", + "... | \n", + "\n", + " | \n", + " | [] | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| 11 | \n", + "976523578966466561 | \n", + "976523578966466561 | \n", + "TanzaniaSpokesperson | \n", + "TZSpokesperson | \n", + "Dodoma, Tanzania | \n", + "NaN | \n", + "Official English Account of the Chief Spokespe... | \n", + "https://t.co/o6LugkYaH3 | \n", + "False | \n", + "4024 | \n", + "... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| 12 | \n", + "126955629 | \n", + "126955629 | \n", + "Yoweri K Museveni | \n", + "KagutaMuseveni | \n", + "Uganda | \n", + "NaN | \n", + "President of the Republic of Uganda | \n", + "https://t.co/98sFzWcbAF | \n", + "False | \n", + "1813693 | \n", + "... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| 13 | \n", + "960107639479906304 | \n", + "960107639479906304 | \n", + "MOFA/MRE -(Angola) | \n", + "angola_Mirex | \n", + "Angola | \n", + "NaN | \n", + "Conta oficial do Twitter do Ministério das Rel... | \n", + "https://t.co/EZEdzQzwGE | \n", + "False | \n", + "3272 | \n", + "... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| 14 | \n", + "337183326 | \n", + "337183326 | \n", + "Amb. Willy Nyamitwe | \n", + "willynyamitwe | \n", + "Burundi, Bujumbura | \n", + "NaN | \n", + "Ambassador & Senior Advisor to HE @GeneralNeva... | \n", + "https://t.co/IqiH1MwnKs | \n", + "False | \n", + "107409 | \n", + "... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| 15 | \n", + "2216872019 | \n", + "2216872019 | \n", + "Chérif Mahamat Zene | \n", + "Cherif_MZ | \n", + "Tchad | \n", + "NaN | \n", + "Ministre de la Communication, Porte-parole du ... | \n", + "https://t.co/D2MAAPTVot | \n", + "False | \n", + "18635 | \n", + "... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| 16 | \n", + "817736921027854336 | \n", + "817736921027854336 | \n", + "Présidence RDC 🇨🇩 | \n", + "Presidence_RDC | \n", + "Kinshasa, Rép. Dém du Congo | \n", + "NaN | \n", + "Bienvenue sur le compte officiel de la Préside... | \n", + "https://t.co/uISGEjLi7o | \n", + "False | \n", + "340934 | \n", + "... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| 17 | \n", + "3013693201 | \n", + "3013693201 | \n", + "Ali Bongo Ondimba | \n", + "PresidentABO | \n", + "Gabon | \n", + "NaN | \n", + "Président de la République Gabonaise | \n", + "https://t.co/HyRWdJhnrg | \n", + "False | \n", + "173601 | \n", + "... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| 18 | \n", + "2853870821 | \n", + "2853870821 | \n", + "Présidence du Bénin | \n", + "PresidenceBenin | \n", + "République du Bénin | \n", + "NaN | \n", + "Compte officiel de la Présidence de la Républi... | \n", + "https://t.co/VqAMM9C6kY | \n", + "False | \n", + "30165 | \n", + "... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| 19 | \n", + "3353383450 | \n", + "3353383450 | \n", + "Roch KABORE | \n", + "rochkaborepf | \n", + "Burkina Faso | \n", + "NaN | \n", + "Président du Faso | \n", + "https://t.co/47yRKu3CMx | \n", + "False | \n", + "256351 | \n", + "... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| 20 | \n", + "580037845 | \n", + "580037845 | \n", + "Presidente Cabo Verde | \n", + "PresidenciaCV | \n", + "Cape Verde | \n", + "NaN | \n", + "Bio: President of the Republic of Cabo Verde.\\... | \n", + "http://t.co/zrtxLrXOSg | \n", + "False | \n", + "3283 | \n", + "... | \n", + "\n", + " | \n", + " | [] | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| 21 | \n", + "86037380 | \n", + "86037380 | \n", + "Alassane Ouattara | \n", + "AOuattara_PRCI | \n", + "Ivory Coast | \n", + "NaN | \n", + "Profil officiel d’Alassane Ouattara, Président... | \n", + "https://t.co/T70r91bUyq | \n", + "False | \n", + "832898 | \n", + "... | \n", + "\n", + " | \n", + " | [] | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| 22 | \n", + "998585232143110144 | \n", + "998585232143110144 | \n", + "State House of The Gambia | \n", + "Presidency_GMB | \n", + "Gambia | \n", + "NaN | \n", + "Official Twitter for the Office of The Preside... | \n", + "https://t.co/vnlfhzchiT | \n", + "False | \n", + "10772 | \n", + "... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| 23 | \n", + "247217109 | \n", + "247217109 | \n", + "Nana Akufo-Addo | \n", + "NAkufoAddo | \n", + "Ghana | \n", + "NaN | \n", + "Official Twitter account of Nana Addo Dankwa A... | \n", + "https://t.co/Vz5z6hVzYV | \n", + "False | \n", + "1508420 | \n", + "... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "[{'id': 1284815212181434369, 'id_str': '128481... | \n", + "[{'id': 1284815212181434369, 'id_str': '128481... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| 24 | \n", + "1207235998406651904 | \n", + "1207235998406651904 | \n", + "Alpha CONDÉ | \n", + "president_gn | \n", + "Guinea | \n", + "NaN | \n", + "Président de la République de Guinée -- Presid... | \n", + "https://t.co/lFypX5PDgC | \n", + "False | \n", + "736 | \n", + "... | \n", + "\n", + " | \n", + " | [] | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "1.258056e+18 | \n", + "1258056308068139010 | \n", + "1.258056e+18 | \n", + "1258056308068139010 | \n", + "
| 25 | \n", + "732872209480491008 | \n", + "732872209480491008 | \n", + "Umaro Sissoco Embalo | \n", + "USEmbalo | \n", + "Guinea Bissau | \n", + "NaN | \n", + "President of the Republic of Guinea-Bissau 🇬🇼\\... | \n", + "https://t.co/fmjH8m2fpB | \n", + "False | \n", + "8482 | \n", + "... | \n", + "\n", + " | \n", + " | [] | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| 26 | \n", + "389486048 | \n", + "389486048 | \n", + "Presidence Mali | \n", + "PresidenceMali | \n", + "Bamako | \n", + "NaN | \n", + "Fil officiel de la Présidence de la République... | \n", + "https://t.co/4w4yX7r4qN | \n", + "False | \n", + "228959 | \n", + "... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "[{'id': 1284214657348247559, 'id_str': '128421... | \n", + "[{'id': 1284214657348247559, 'id_str': '128421... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| 27 | \n", + "1207767213844914176 | \n", + "1207767213844914176 | \n", + "Mohamed Cheikh El Ghazouani محمد ولدالشيخ الغز... | \n", + "CheikhGhazouani | \n", + "Nouakchott | \n", + "NaN | \n", + "رئيس الجمهورية الإسلامية الموريتانية Président... | \n", + "https://t.co/yODYwZTv04 | \n", + "False | \n", + "31805 | \n", + "... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| 28 | \n", + "4821435801 | \n", + "4821435801 | \n", + "Issoufou Mahamadou | \n", + "IssoufouMhm | \n", + "Niger | \n", + "NaN | \n", + "Compte officiel d'Issoufou Mahamadou, Présiden... | \n", + "https://t.co/yqT76kKsIq | \n", + "False | \n", + "116302 | \n", + "... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| 29 | \n", + "2936714848 | \n", + "2936714848 | \n", + "Muhammadu Buhari | \n", + "MBuhari | \n", + "\n", + " | NaN | \n", + "This is the official account of Muhammadu Buha... | \n", + "None | \n", + "False | \n", + "3272237 | \n", + "... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| 30 | \n", + "197493438 | \n", + "197493438 | \n", + "Macky Sall | \n", + "Macky_Sall | \n", + "Sénégal | \n", + "NaN | \n", + "Président de la République du Sénégal 🇸🇳 | \n", + "https://t.co/FK2Eo1gPuQ | \n", + "False | \n", + "1375730 | \n", + "... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| 31 | \n", + "983228767761027072 | \n", + "983228767761027072 | \n", + "President Julius Maada Bio | \n", + "PresidentBio | \n", + "Sierra Leone | \n", + "NaN | \n", + "H.E. Julius Maada Wonie Bio was inaugurated as... | \n", + "https://t.co/KHVHrCBNYA | \n", + "False | \n", + "14907 | \n", + "... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
| 32 | \n", + "4920180340 | \n", + "4920180340 | \n", + "Ministère de la Santé et de l'hygiène Publique | \n", + "MSPS_Togo | \n", + "Lomé | \n", + "NaN | \n", + "\n", + " | https://t.co/sYvXay8AhT | \n", + "False | \n", + "1132 | \n", + "... | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "NaN | \n", + "
33 rows × 121 columns
\n", + "| \n", + " | screen_name | \n", + "followers_count | \n", + "friends_count | \n", + "statuses_count | \n", + "favourites_count | \n", + "Popularity_Score | \n", + "Reach_Score | \n", + "
|---|---|---|---|---|---|---|---|
| 14 | \n", + "willynyamitwe | \n", + "107409 | \n", + "4656 | \n", + "40682 | \n", + "6259 | \n", + "46941 | \n", + "102753 | \n", + "
| 1 | \n", + "PresidencyZA | \n", + "1599341 | \n", + "14 | \n", + "18881 | \n", + "63 | \n", + "18944 | \n", + "1599327 | \n", + "
| 26 | \n", + "PresidenceMali | \n", + "228959 | \n", + "1001 | \n", + "11168 | \n", + "1732 | \n", + "12900 | \n", + "227958 | \n", + "
| 6 | \n", + "StateHouseKenya | \n", + "1104077 | \n", + "214 | \n", + "9050 | \n", + "61 | \n", + "9111 | \n", + "1103863 | \n", + "
| 23 | \n", + "NAkufoAddo | \n", + "1508420 | \n", + "352 | \n", + "7098 | \n", + "134 | \n", + "7232 | \n", + "1508068 | \n", + "
| 21 | \n", + "AOuattara_PRCI | \n", + "832898 | \n", + "23 | \n", + "7139 | \n", + "4 | \n", + "7143 | \n", + "832875 | \n", + "
| 25 | \n", + "USEmbalo | \n", + "8482 | \n", + "181 | \n", + "828 | \n", + "6065 | \n", + "6893 | \n", + "8301 | \n", + "
| 12 | \n", + "KagutaMuseveni | \n", + "1813693 | \n", + "28 | \n", + "6645 | \n", + "76 | \n", + "6721 | \n", + "1813665 | \n", + "
| 18 | \n", + "PresidenceBenin | \n", + "30165 | \n", + "66 | \n", + "5649 | \n", + "94 | \n", + "5743 | \n", + "30099 | \n", + "
| 5 | \n", + "hawelti | \n", + "66245 | \n", + "435 | \n", + "4718 | \n", + "735 | \n", + "5453 | \n", + "65810 | \n", + "
| 19 | \n", + "rochkaborepf | \n", + "256351 | \n", + "151 | \n", + "4496 | \n", + "475 | \n", + "4971 | \n", + "256200 | \n", + "
| 29 | \n", + "MBuhari | \n", + "3272237 | \n", + "26 | \n", + "4734 | \n", + "8 | \n", + "4742 | \n", + "3272211 | \n", + "
| 7 | \n", + "PaulKagame | \n", + "1984272 | \n", + "181 | \n", + "2862 | \n", + "616 | \n", + "3478 | \n", + "1984091 | \n", + "
| 30 | \n", + "Macky_Sall | \n", + "1375730 | \n", + "171 | \n", + "2796 | \n", + "530 | \n", + "3326 | \n", + "1375559 | \n", + "
| 22 | \n", + "Presidency_GMB | \n", + "10772 | \n", + "27 | \n", + "1440 | \n", + "452 | \n", + "1892 | \n", + "10745 | \n", + "
| 17 | \n", + "PresidentABO | \n", + "173601 | \n", + "4 | \n", + "1738 | \n", + "16 | \n", + "1754 | \n", + "173597 | \n", + "
| 16 | \n", + "Presidence_RDC | \n", + "340934 | \n", + "125 | \n", + "1650 | \n", + "99 | \n", + "1749 | \n", + "340809 | \n", + "
| 4 | \n", + "MinSantedj | \n", + "2934 | \n", + "127 | \n", + "1065 | \n", + "587 | \n", + "1652 | \n", + "2807 | \n", + "
| 0 | \n", + "hagegeingob | \n", + "192470 | \n", + "55 | \n", + "1087 | \n", + "268 | \n", + "1355 | \n", + "192415 | \n", + "
| 15 | \n", + "Cherif_MZ | \n", + "18635 | \n", + "196 | \n", + "753 | \n", + "473 | \n", + "1226 | \n", + "18439 | \n", + "
| 13 | \n", + "angola_Mirex | \n", + "3272 | \n", + "312 | \n", + "732 | \n", + "447 | \n", + "1179 | \n", + "2960 | \n", + "
| 2 | \n", + "mohzambia | \n", + "7170 | \n", + "95 | \n", + "838 | \n", + "163 | \n", + "1001 | \n", + "7075 | \n", + "
| 11 | \n", + "TZSpokesperson | \n", + "4024 | \n", + "32 | \n", + "836 | \n", + "1 | \n", + "837 | \n", + "3992 | \n", + "
| 20 | \n", + "PresidenciaCV | \n", + "3283 | \n", + "885 | \n", + "715 | \n", + "91 | \n", + "806 | \n", + "2398 | \n", + "
| 10 | \n", + "SudanPMHamdok | \n", + "371069 | \n", + "115 | \n", + "652 | \n", + "43 | \n", + "695 | \n", + "370954 | \n", + "
| 3 | \n", + "edmnangagwa | \n", + "546537 | \n", + "116 | \n", + "628 | \n", + "65 | \n", + "693 | \n", + "546421 | \n", + "
| 8 | \n", + "M_Farmaajo | \n", + "424425 | \n", + "2 | \n", + "599 | \n", + "22 | \n", + "621 | \n", + "424423 | \n", + "
| 9 | \n", + "SouthSudanGov | \n", + "2559 | \n", + "463 | \n", + "209 | \n", + "348 | \n", + "557 | \n", + "2096 | \n", + "
| 28 | \n", + "IssoufouMhm | \n", + "116302 | \n", + "17 | \n", + "349 | \n", + "3 | \n", + "352 | \n", + "116285 | \n", + "
| 31 | \n", + "PresidentBio | \n", + "14907 | \n", + "0 | \n", + "83 | \n", + "0 | \n", + "83 | \n", + "14907 | \n", + "
| 32 | \n", + "MSPS_Togo | \n", + "1132 | \n", + "2 | \n", + "44 | \n", + "1 | \n", + "45 | \n", + "1130 | \n", + "
| 27 | \n", + "CheikhGhazouani | \n", + "31805 | \n", + "9 | \n", + "30 | \n", + "0 | \n", + "30 | \n", + "31796 | \n", + "
| 24 | \n", + "president_gn | \n", + "736 | \n", + "29 | \n", + "21 | \n", + "6 | \n", + "27 | \n", + "707 | \n", + "
| \n", + " | screen_name | \n", + "followers_count | \n", + "friends_count | \n", + "statuses_count | \n", + "favourites_count | \n", + "Popularity_Score | \n", + "Reach_Score | \n", + "
|---|---|---|---|---|---|---|---|
| 80 | \n", + "UlrichJvV | \n", + "1042471 | \n", + "530305 | \n", + "19998 | \n", + "347436 | \n", + "367434 | \n", + "512166 | \n", + "
| 89 | \n", + "News24 | \n", + "3577999 | \n", + "631 | \n", + "322904 | \n", + "1143 | \n", + "324047 | \n", + "3577368 | \n", + "
| 47 | \n", + "CityofJoburgZA | \n", + "1002758 | \n", + "61972 | \n", + "265302 | \n", + "33984 | \n", + "299286 | \n", + "940786 | \n", + "
| 30 | \n", + "africatechie | \n", + "106164 | \n", + "1644 | \n", + "101334 | \n", + "136604 | \n", + "237938 | \n", + "104520 | \n", + "
| 2 | \n", + "AndiMakinana | \n", + "101278 | \n", + "2838 | \n", + "142232 | \n", + "9028 | \n", + "151260 | \n", + "98440 | \n", + "
| ... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "... | \n", + "
| 38 | \n", + "africamedia_CPJ | \n", + "487 | \n", + "0 | \n", + "35 | \n", + "0 | \n", + "35 | \n", + "487 | \n", + "
| 78 | \n", + "BBCAndrewH | \n", + "7 | \n", + "0 | \n", + "6 | \n", + "0 | \n", + "6 | \n", + "7 | \n", + "
| 72 | \n", + "SmithInAfrica | \n", + "69 | \n", + "0 | \n", + "1 | \n", + "0 | \n", + "1 | \n", + "69 | \n", + "
| 7 | \n", + "stateafrica | \n", + "8 | \n", + "0 | \n", + "1 | \n", + "0 | \n", + "1 | \n", + "8 | \n", + "
| 26 | \n", + "ThisisAfrica | \n", + "6 | \n", + "0 | \n", + "0 | \n", + "0 | \n", + "0 | \n", + "6 | \n", + "
93 rows × 7 columns
\n", + "| \n", + " | GHO | \n", + "PUBLISHSTATE | \n", + "YEAR | \n", + "REGION | \n", + "COUNTRY | \n", + "AGEGROUP | \n", + "SEX | \n", + "Display Value | \n", + "Numeric | \n", + "MidAge | \n", + "
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | \n", + "LIFE_0000000030 | \n", + "PUBLISHED | \n", + "2016 | \n", + "AFR | \n", + "NGA | \n", + "0-1 | \n", + "Male | \n", + "0.071 | \n", + "0.07128 | \n", + "-3 | \n", + "
| 1 | \n", + "LIFE_0000000030 | \n", + "PUBLISHED | \n", + "2016 | \n", + "SEAR | \n", + "IND | \n", + "0-1 | \n", + "Male | \n", + "0.034 | \n", + "0.03386 | \n", + "-3 | \n", + "
| 2 | \n", + "LIFE_0000000030 | \n", + "PUBLISHED | \n", + "2016 | \n", + "AFR | \n", + "NGA | \n", + "0-1 | \n", + "Female | \n", + "0.062 | \n", + "0.06243 | \n", + "-3 | \n", + "
| 3 | \n", + "LIFE_0000000030 | \n", + "PUBLISHED | \n", + "2016 | \n", + "SEAR | \n", + "IND | \n", + "0-1 | \n", + "Female | \n", + "0.038 | \n", + "0.03755 | \n", + "-3 | \n", + "
| 4 | \n", + "LIFE_0000000030 | \n", + "PUBLISHED | \n", + "2016 | \n", + "AFR | \n", + "NGA | \n", + "1-4 | \n", + "Male | \n", + "0.039 | \n", + "0.03914 | \n", + "2 | \n", + "
\n",
- "\n",
- "Fill in the app creation page with a unique name, a website name (use a placeholder website if you don’t have one), and a project description. Accept the terms and conditions and proceed to the next page.\n",
- "\n",
- "Once your project has been created, click on the “Keys and Access Tokens” tab. You should now be able to see your consumer secret and consumer key.\n",
- "\n",
- "
\n",
- "\n",
- "You’ll also need a pair of access tokens. Scroll down and request those tokens. The page should refresh, and you should now have an access token and access token secret.\n",
- "\n",
- "
\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Import necessary modules"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 32,
- "metadata": {
- "colab": {},
- "colab_type": "code",
- "id": "UI2fIQFxrNLB",
- "run_control": {
- "frozen": false,
- "read_only": false
- }
- },
- "outputs": [],
- "source": [
- "import sys\n",
- "import os\n",
- "import json\n",
- "import pandas as pd\n",
- "import matplotlib.pyplot as plt"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "colab": {},
- "colab_type": "code",
- "id": "3pf5Xapqrq0M"
- },
- "outputs": [],
- "source": [
- "#Import the necessary methods from tweepy library \n",
- "\n",
- "#install tweepy if you don't have it\n",
- "#!pip install tweepy\n",
- "import tweepy\n",
- "from tweepy.streaming import StreamListener\n",
- "from tweepy import OAuthHandler\n",
- "from tweepy import Stream\n",
- "\n",
- "#sentiment analysis package\n",
- "#!pip install textblob\n",
- "from textblob import TextBlob\n",
- "\n",
- "#general text pre-processor\n",
- "#!pip install nltk\n",
- "import nltk\n",
- "from nltk.corpus import stopwords\n",
- "\n",
- "#tweet pre-processor \n",
- "#!pip install tweet-preprocessor\n",
- "import preprocessor as ppr"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Starting code\n",
- "Below we define some starting codes (python classes and function) to illustrate and assist on how to fetch data from twitter and analyse them. \n",
- "\n",
- "### **Your task is**\n",
- "1. Go through the code and understand it. Know what each function does\n",
- "2. If you find error, fix it. Ask for help in the slack channel if you find serious mistake\n",
- "3. Extend the code such that it will be useful for topics you choose to analyse\n",
- "4. Make nice plots and share your finding (e.g. insight on the main covid19 twitter converstions about your country)\n",
- "5. Submit what ever you managed to do by Wednesday morning. But you should keep using what you build to write blogs, share on facebook, etc. \n",
- "\n",
- "\n",
- "[Reference used to build some of the functions here](https://towardsdatascience.com/extracting-twitter-data-pre-processing-and-sentiment-analysis-using-python-3-0-7192bd8b47cf)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 38,
- "metadata": {},
- "outputs": [],
- "source": [
- "class tweetsearch():\n",
- " '''\n",
- " This is a basic class to search and download twitter data.\n",
- " You can build up on it to extend the functionalities for more \n",
- " sophisticated analysis.\n",
- " \n",
- " '''\n",
- " def __init__(self,cols=None,auth=None):\n",
- " #\n",
- " if not cols is None:\n",
- " self.cols = cols\n",
- " else:\n",
- " self.cols = ['id', 'created_at', 'source', 'original_text','clean_text', \n",
- " 'sentiment','polarity','subjectivity', 'lang',\n",
- " 'favorite_count', 'retweet_count', 'original_author', \n",
- " 'possibly_sensitive', 'hashtags',\n",
- " 'user_mentions', 'place', 'place_coord_boundaries']\n",
- " \n",
- " if auth is None:\n",
- " #Variables that contains the user credentials to access Twitter API \n",
- " consumer_key = os.environ.get('TWITTER_API_KEY')\n",
- " consumer_secret = os.environ.get('TWITTER_API_SECRET')\n",
- " access_token = os.environ.get('TWITTER_ACCESS_TOKEN')\n",
- " access_token_secret = os.environ.get('TWITTER_ACCESS_TOKEN_SECRET')\n",
- "\n",
- "\n",
- " #This handles Twitter authetification and the connection to Twitter \n",
- " #Streaming API\n",
- " auth = OAuthHandler(consumer_key, consumer_secret)\n",
- " auth.set_access_token(access_token, access_token_secret)\n",
- " \n",
- "\n",
- " # \n",
- " self.auth = auth\n",
- " self.api = tweepy.API(auth) \n",
- " \n",
- "\n",
- " def clean_tweets(self,twitter_text):\n",
- "\n",
- " #use pre processor\n",
- " tweet = p.clean(twitter_text)\n",
- "\n",
- " #HappyEmoticons\n",
- " emoticons_happy = set([\n",
- " ':-)', ':)', ';)', ':o)', ':]', ':3', ':c)', ':>', '=]', '8)', '=)', ':}',\n",
- " ':^)', ':-D', ':D', '8-D', '8D', 'x-D', 'xD', 'X-D', 'XD', '=-D', '=D',\n",
- " '=-3', '=3', ':-))', \":'-)\", \":')\", ':*', ':^*', '>:P', ':-P', ':P', 'X-P',\n",
- " 'x-p', 'xp', 'XP', ':-p', ':p', '=p', ':-b', ':b', '>:)', '>;)', '>:-)',\n",
- " '<3'\n",
- " ])\n",
- "\n",
- " # Sad Emoticons\n",
- " emoticons_sad = set([\n",
- " ':L', ':-/', '>:/', ':S', '>:[', ':@', ':-(', ':[', ':-||', '=L', ':<',\n",
- " ':-[', ':-<', '=\\\\', '=/', '>:(', ':(', '>.<', \":'-(\", \":'(\", ':\\\\', ':-c',\n",
- " ':c', ':{', '>:\\\\', ';('\n",
- " ])\n",
- "\n",
- " #Emoji patterns\n",
- " emoji_pattern = re.compile(\"[\"\n",
- " u\"\\U0001F600-\\U0001F64F\" # emoticons\n",
- " u\"\\U0001F300-\\U0001F5FF\" # symbols & pictographs\n",
- " u\"\\U0001F680-\\U0001F6FF\" # transport & map symbols\n",
- " u\"\\U0001F1E0-\\U0001F1FF\" # flags (iOS)\n",
- " u\"\\U00002702-\\U000027B0\"\n",
- " u\"\\U000024C2-\\U0001F251\"\n",
- " \"]+\", flags=re.UNICODE)\n",
- "\n",
- " #combine sad and happy emoticons\n",
- " emoticons = emoticons_happy.union(emoticons_sad)\n",
- "\n",
- " stop_words = set(stopwords.words('english'))\n",
- " word_tokens = word_tokenize(tweet)\n",
- " #after tweepy preprocessing the colon symbol left remain after \n",
- " #removing mentions\n",
- " tweet = re.sub(r':', '', tweet)\n",
- " tweet = re.sub(r'…', '', tweet)\n",
- "\n",
- " #replace consecutive non-ASCII characters with a space\n",
- " tweet = re.sub(r'[^\\x00-\\x7F]+',' ', tweet)\n",
- "\n",
- " #remove emojis from tweet\n",
- " tweet = emoji_pattern.sub(r'', tweet)\n",
- "\n",
- " #filter using NLTK library append it to a string\n",
- " filtered_tweet = [w for w in word_tokens if not w in stop_words]\n",
- "\n",
- " #looping through conditions\n",
- " filtered_tweet = [] \n",
- " for w in word_tokens:\n",
- " #check tokens against stop words , emoticons and punctuations\n",
- " if w not in stop_words and w not in emoticons and w not in string.punctuation:\n",
- " filtered_tweet.append(w)\n",
- "\n",
- " return ' '.join(filtered_tweet) \n",
- "\n",
- " def get_tweets(self, keyword, csvfile=None):\n",
- " \n",
- " \n",
- " df = pd.DataFrame(columns=self.cols)\n",
- " \n",
- " if not csvfile is None:\n",
- " #If the file exists, then read the existing data from the CSV file.\n",
- " if os.path.exists(csvfile):\n",
- " df = pd.read_csv(csvfile, header=0)\n",
- " \n",
- "\n",
- " #page attribute in tweepy.cursor and iteration\n",
- " for page in tweepy.Cursor(api.search, q=keyword,count=200, include_rts=False):\n",
- "\n",
- "\n",
- " for status in page:\n",
- " \n",
- " new_entry = []\n",
- " status = status._json\n",
- " \n",
- " #filter by language\n",
- " if status['lang'] != 'en':\n",
- " continue\n",
- "\n",
- " \n",
- " #if this tweet is a retweet update retweet count\n",
- " if status['created_at'] in df['created_at'].values:\n",
- " i = df.loc[df['created_at'] == status['created_at']].index[0]\n",
- " #\n",
- " cond1 = status['favorite_count'] != df.at[i, 'favorite_count']\n",
- " cond2 = status['retweet_count'] != df.at[i, 'retweet_count']\n",
- " if cond1 or cond2:\n",
- " df.at[i, 'favorite_count'] = status['favorite_count']\n",
- " df.at[i, 'retweet_count'] = status['retweet_count']\n",
- " continue\n",
- "\n",
- " #calculate sentiment\n",
- " blob = TextBlob(filtered_tweet)\n",
- " Sentiment = blob.sentiment \n",
- " polarity = Sentiment.polarity\n",
- " subjectivity = Sentiment.subjectivity\n",
- "\n",
- " new_entry += [status['id'], status['created_at'],\n",
- " status['source'], status['text'],filtered_tweet, \n",
- " Sentiment,polarity,subjectivity, status['lang'],\n",
- " status['favorite_count'], status['retweet_count']]\n",
- "\n",
- " new_entry.append(status['user']['screen_name'])\n",
- "\n",
- " try:\n",
- " is_sensitive = status['possibly_sensitive']\n",
- " except KeyError:\n",
- " is_sensitive = None\n",
- "\n",
- " new_entry.append(is_sensitive)\n",
- "\n",
- " hashtags = \", \".join([hashtag_item['text'] for \\\n",
- " hashtag_item in status['entities']['hashtags']])\n",
- " new_entry.append(hashtags) #append the hashtags\n",
- "\n",
- " #\n",
- " mentions = \", \".join([mention['screen_name'] for \\\n",
- " mention in status['entities']['user_mentions']])\n",
- " new_entry.append(mentions) #append the user mentions\n",
- "\n",
- " try:\n",
- " xyz = status['place']['bounding_box']['coordinates']\n",
- " coordinates = [coord for loc in xyz for coord in loc]\n",
- " except TypeError:\n",
- " coordinates = None\n",
- " #\n",
- " new_entry.append(coordinates)\n",
- "\n",
- " try:\n",
- " location = status['user']['location']\n",
- " except TypeError:\n",
- " location = ''\n",
- " #\n",
- " new_entry.append(location)\n",
- "\n",
- " #now append a row to the dataframe\n",
- " single_tweet_df = pd.DataFrame([new_entry], columns=self.cols)\n",
- " df = df.append(single_tweet_df, ignore_index=True)\n",
- "\n",
- " if not csvfile is None:\n",
- " #save it to file\n",
- " df.to_csv(csvfile, columns=self.cols, index=False, encoding=\"utf-8\")\n",
- " \n",
- " return df\n",
- "\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Search twitter and fetch data example"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "covid_keywords = '#COVID19 OR #COVID19Africa' #hashtag based search\n",
- "tweets_file = 'data/ethiopia_covid19_23june2020.json'\n",
- "\n",
- "#get data on keywords\n",
- "ts = tweetsearch()\n",
- "df = ts.get_tweets(covid_keywords, csvfile=tweets_file) #you saved the "
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Stream data and save it to file\n",
- "In the above we saw how to search and fetch data, below we will see how we will stream data from twitter. Make sure you understand the difference between search and stream features of twitter api.\n",
- "\n",
- "### **SAME TASK AS ABOVE**\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 41,
- "metadata": {
- "colab": {},
- "colab_type": "code",
- "id": "r6lcy009rX_e"
- },
- "outputs": [],
- "source": [
- "#This is a basic listener that writes received tweets to file.\n",
- "class StdOutListener(StreamListener):\n",
- "\n",
- " def __init__(self,fhandle, stop_at = 1000):\n",
- " self.tweet_counter = 0\n",
- " self.stop_at = stop_at\n",
- " self.fhandle = fhandle\n",
- " \n",
- " \n",
- " def on_data(self, data):\n",
- " self.fhandle.write(data)\n",
- " \n",
- " #stop if enough tweets are obtained\n",
- " self.tweet_counter += 1 \n",
- " if self.tweet_counter < self.stop_at: \n",
- " return True\n",
- " else:\n",
- " print('Max number of tweets reached: #tweets = ' + str(self.tweet_counter))\n",
- " return False\n",
- "\n",
- " def on_error(self, status):\n",
- " print (status)\n",
- "\n",
- "def stream_tweet_data(filename='data/tweets.json',\n",
- " keywords=['COVID19Africa','COVID19Ethiopia'],\n",
- " is_async=False):\n",
- " # tweet topics to use as a filter. The tweets downloaded\n",
- " # will have one of the topics in their text or hashtag \n",
- "\n",
- " print('saving data to file: ',filename)\n",
- "\n",
- " #print the tweet topics \n",
- " print('TweetKeywords are: ',keywords)\n",
- " print('For testing case, please interupt the downloading process using ctrl+x after about 5 mins ')\n",
- " print('To keep streaming in the background, pass is_async=True')\n",
- "\n",
- " #Variables that contains the user credentials to access Twitter API \n",
- " consumer_key = os.environ.get('TWITTER_API_KEY')\n",
- " consumer_secret = os.environ.get('TWITTER_API_SECRET')\n",
- " access_token = os.environ.get('TWITTER_ACCESS_TOKEN')\n",
- " access_token_secret = os.environ.get('TWITTER_ACCESS_TOKEN_SECRET')\n",
- "\n",
- " #open file \n",
- " fhandle=open(filename,'w')\n",
- "\n",
- " #This handles Twitter authetification and the connection to Twitter Streaming API\n",
- " l = StdOutListener(fhandle)\n",
- " auth = OAuthHandler(consumer_key, consumer_secret)\n",
- " auth.set_access_token(access_token, access_token_secret)\n",
- "\n",
- " stream = Stream(auth, l)\n",
- "\n",
- " #This line filter Twitter Streams to capture data by the keywords: first argument to this code\n",
- " stream.filter(track=keywords,is_async=is_async)\n",
- "\n",
- " return None\n",
- "\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Use case of the above code"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 42,
- "metadata": {
- "colab": {},
- "colab_type": "code",
- "id": "F8tcPcSMrNLL",
- "outputId": "d7abd9c2-065c-40e8-f71b-e808d985c364"
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "saving data to file: data/covid19_23june2020.json\n",
- "TweetKeywords are: ['covid19', '#COVID19Africa']\n",
- "For testing case, please interupt the downloading process using ctrl+x after about 5 mins \n",
- "To keep streaming in the background, pass is_async=True\n",
- "Max number of tweets reached: #tweets = 1000\n"
- ]
- }
- ],
- "source": [
- "tweets_file = 'data/covid19_23june2020.json'\n",
- "stream_tweet_data(filename=tweets_file,keywords=['covid19','#COVID19Africa']) #\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Filter twitter data and do basic analysis\n",
- "**Extend it to gain more insight**"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 27,
- "metadata": {
- "colab": {},
- "colab_type": "code",
- "id": "F8tcPcSMrNLL",
- "outputId": "d7abd9c2-065c-40e8-f71b-e808d985c364"
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "saved numbers of tweets: 998\n"
- ]
- }
- ],
- "source": [
- "tweets_data = []\n",
- "for line in open(tweets_file, \"r\"):\n",
- " try:\n",
- " tweet = json.loads(line)\n",
- " x=tweet['text']\n",
- " tweets_data.append(tweet)\n",
- " except:\n",
- " continue\n",
- "\n",
- "\n",
- "print('saved numbers of tweets: ', len(tweets_data))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 30,
- "metadata": {
- "colab": {},
- "colab_type": "code",
- "id": "hlFKyGnYrNLX"
- },
- "outputs": [],
- "source": [
- "tweets = pd.DataFrame(columns=['text','lang','country'])\n",
- "\n",
- "tweets['text'] = list(map(lambda tweet: tweet['text'], tweets_data))\n",
- "tweets['lang'] = list(map(lambda tweet: tweet['lang'], tweets_data))\n",
- "tweets['country'] = list(map(lambda tweet: tweet['place']['country'] if tweet['place'] != None else None, \n",
- " tweets_data))\n",
- "\n",
- "\n",
- "tweets_by_lang = tweets['lang'].value_counts()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 31,
- "metadata": {
- "colab": {},
- "colab_type": "code",
- "id": "aEPPoCBtrNLd",
- "outputId": "bfe0cee1-814d-4f30-f47d-205218b3adc9"
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "