{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "[![img](..\\ep8_2018-57x57.png)](http://endlesspint.com/)\n", "\n", "# Reseen By Us\n", "\n", "**post @** [endlesspint.com](http://endlesspint.com/2019-08-02-re-seen-by-us-bar-reviews/)" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "\n", "import math\n", "\n", "import matplotlib.pyplot as plt\n", "plt.style.use('ggplot')\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "bar object\n", "bar_page object\n", "date datetime64[ns]\n", "rating int64\n", "rev_id object\n", "dtype: object\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
barbar_pagedateratingrev_id
0230_Fifth230_Fifth_001.html2019-06-255review_684354546
1230_Fifth230_Fifth_001.html2019-06-244review_684119771
2230_Fifth230_Fifth_001.html2019-06-245review_684100368
3230_Fifth230_Fifth_001.html2019-06-235review_683754001
4230_Fifth230_Fifth_001.html2019-06-225review_683526393
\n", "
" ], "text/plain": [ " bar bar_page date rating rev_id\n", "0 230_Fifth 230_Fifth_001.html 2019-06-25 5 review_684354546\n", "1 230_Fifth 230_Fifth_001.html 2019-06-24 4 review_684119771\n", "2 230_Fifth 230_Fifth_001.html 2019-06-24 5 review_684100368\n", "3 230_Fifth 230_Fifth_001.html 2019-06-23 5 review_683754001\n", "4 230_Fifth 230_Fifth_001.html 2019-06-22 5 review_683526393" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_ta_bar_reviews = pd.read_excel(\"ta_bar_reviews.xlsx\")\n", "\n", "df_ta_bar_reviews.date = pd.to_datetime(df_ta_bar_reviews.date)\n", "print(df_ta_bar_reviews.dtypes)\n", "\n", "df_ta_bar_reviews.head()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "def first_of_month(x):\n", " return x.replace(day=1)\n", "\n", "df_ta_bar_reviews['first_of_month'] = df_ta_bar_reviews.date.apply(first_of_month)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "230_Fifth 1712 3.953\n", "Beer_Authority 581 4.076\n", "Beer_Culture 150 4.473\n", "Blind_Tiger_Ale_House 258 4.492\n", "Broome_Street_Bar 199 4.266\n", "Buddha_Beer_Bar 16 4.0\n", "Dalton_s_Bar_Grill 122 4.361\n", "Earl_s_Beer_and_Cheese 70 4.343\n", "Houston_Hall 73 4.178\n", "Jeremy_s_Ale_House 89 4.281\n", "Jimmy_s_Corner 389 4.491\n", "Kiabacca_Bar 54 4.556\n", "Loreley_Beer_Garden 74 3.959\n", "Mercury_Bar 122 4.303\n", "Mr_Biggs_Bar_Grill 140 3.95\n", "New_York_Beer_Company 275 4.215\n", "Old_Town_Bar 141 4.149\n", "O_Reilly_s_Bar_Kitchen 294 4.289\n", "Randolph_Beer 47 3.979\n", "Rattle_and_Hum 161 4.137\n", "Sean_s_Bar_And_Kitchen 244 4.324\n", "Social_Bar 131 4.13\n", "Taproom_307 69 4.203\n", "The_Cannibal_Beer_Butcher 104 4.212\n", "The_Ginger_Man 227 4.269\n", "The_House_of_Brews 230 4.217\n", "The_Jeffrey_Craft_Beer_Bar_and_Bites 80 4.488\n", "The_Three_Monkeys 513 4.308\n", "Top_Hops 72 4.625\n", "Valhalla 97 4.309\n" ] } ], "source": [ "for b in df_ta_bar_reviews.bar.unique():\n", " print(b, \\\n", " df_ta_bar_reviews[df_ta_bar_reviews.bar==b]['bar'].count(), \\\n", " np.round(df_ta_bar_reviews[df_ta_bar_reviews.bar==b]['rating'].mean(), 3))" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
bars_avgw_avgper_dif
0Kiabacca_Bar4.5564.7970.053
1The_Jeffrey_Craft_Beer_Bar_and_Bites4.4884.6340.033
2Mercury_Bar4.3034.5670.061
3Dalton_s_Bar_Grill4.3614.4920.030
4Blind_Tiger_Ale_House4.4924.471-0.005
5Beer_Culture4.4734.468-0.001
6230_Fifth3.9534.4570.127
7O_Reilly_s_Bar_Kitchen4.2894.4570.039
8Sean_s_Bar_And_Kitchen4.3244.4160.021
9Broome_Street_Bar4.2664.4120.034
10Valhalla4.3094.4000.021
11Top_Hops4.6254.379-0.053
12Jimmy_s_Corner4.4914.362-0.029
13The_Three_Monkeys4.3084.3600.012
14Jeremy_s_Ale_House4.2814.3130.007
15Houston_Hall4.1784.2980.029
16The_House_of_Brews4.2174.2740.014
17New_York_Beer_Company4.2154.2640.012
18Taproom_3074.2034.195-0.002
19Rattle_and_Hum4.1374.1420.001
20Social_Bar4.1304.115-0.004
21The_Ginger_Man4.2693.998-0.063
22Beer_Authority4.0763.831-0.060
23Old_Town_Bar4.1493.829-0.077
24Mr_Biggs_Bar_Grill3.9503.802-0.037
25Earl_s_Beer_and_Cheese4.3433.801-0.125
26Loreley_Beer_Garden3.9593.747-0.054
27The_Cannibal_Beer_Butcher4.2123.706-0.120
28Randolph_Beer3.9793.653-0.082
29Buddha_Beer_Bar4.0002.632-0.342
\n", "
" ], "text/plain": [ " bar s_avg w_avg per_dif\n", "0 Kiabacca_Bar 4.556 4.797 0.053\n", "1 The_Jeffrey_Craft_Beer_Bar_and_Bites 4.488 4.634 0.033\n", "2 Mercury_Bar 4.303 4.567 0.061\n", "3 Dalton_s_Bar_Grill 4.361 4.492 0.030\n", "4 Blind_Tiger_Ale_House 4.492 4.471 -0.005\n", "5 Beer_Culture 4.473 4.468 -0.001\n", "6 230_Fifth 3.953 4.457 0.127\n", "7 O_Reilly_s_Bar_Kitchen 4.289 4.457 0.039\n", "8 Sean_s_Bar_And_Kitchen 4.324 4.416 0.021\n", "9 Broome_Street_Bar 4.266 4.412 0.034\n", "10 Valhalla 4.309 4.400 0.021\n", "11 Top_Hops 4.625 4.379 -0.053\n", "12 Jimmy_s_Corner 4.491 4.362 -0.029\n", "13 The_Three_Monkeys 4.308 4.360 0.012\n", "14 Jeremy_s_Ale_House 4.281 4.313 0.007\n", "15 Houston_Hall 4.178 4.298 0.029\n", "16 The_House_of_Brews 4.217 4.274 0.014\n", "17 New_York_Beer_Company 4.215 4.264 0.012\n", "18 Taproom_307 4.203 4.195 -0.002\n", "19 Rattle_and_Hum 4.137 4.142 0.001\n", "20 Social_Bar 4.130 4.115 -0.004\n", "21 The_Ginger_Man 4.269 3.998 -0.063\n", "22 Beer_Authority 4.076 3.831 -0.060\n", "23 Old_Town_Bar 4.149 3.829 -0.077\n", "24 Mr_Biggs_Bar_Grill 3.950 3.802 -0.037\n", "25 Earl_s_Beer_and_Cheese 4.343 3.801 -0.125\n", "26 Loreley_Beer_Garden 3.959 3.747 -0.054\n", "27 The_Cannibal_Beer_Butcher 4.212 3.706 -0.120\n", "28 Randolph_Beer 3.979 3.653 -0.082\n", "29 Buddha_Beer_Bar 4.000 2.632 -0.342" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\n", "def month_weight(x, w=24):\n", " return np.max((w - math.floor(x), 0))\n", "\n", "\n", "def latest_weighted_rating(df, bar_field, bar_name, date_field, rating_field):\n", " df_bar = df[df[bar_field] == bar_name]\n", " max_date = df_bar[date_field].max()\n", " m_weight = ((max_date - df_bar[date_field])/(np.timedelta64(1, 'M'))).apply(month_weight)\n", " return np.round(np.sum(m_weight * df_bar[rating_field]) / float(np.sum(m_weight)), 3)\n", "\n", "latest_ratings = []\n", "\n", "\n", "for b in df_ta_bar_reviews.bar.unique():\n", " latest_ratings.append({'bar': b, \\\n", " 'w_avg': latest_weighted_rating(df_ta_bar_reviews, \"bar\", b, \"first_of_month\", \"rating\"), \\\n", " 's_avg': np.round(df_ta_bar_reviews[df_ta_bar_reviews.bar==b]['rating'].mean(), 3)\n", " })\n", "\n", "df_latest_w_ratings = pd.DataFrame(latest_ratings).sort_values('w_avg', ascending=False).reset_index(drop=True)\n", "df_latest_w_ratings['per_dif'] = np.round( \\\n", " (( df_latest_w_ratings.w_avg - df_latest_w_ratings.s_avg ) / df_latest_w_ratings.s_avg), 3)\n", "\n", "df_latest_w_ratings" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## confirm results from grouped rating approach (sample)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
barbar_pagedateratingrev_idfirst_of_month
6565Top_HopsTop_Hops_001.html2018-08-234review_6095481262018-08-01
6566Top_HopsTop_Hops_001.html2018-07-305review_6011811342018-07-01
6567Top_HopsTop_Hops_001.html2018-07-232review_5990640162018-07-01
6568Top_HopsTop_Hops_001.html2018-07-094review_5947747062018-07-01
6569Top_HopsTop_Hops_001.html2018-06-115review_5867543682018-06-01
6570Top_HopsTop_Hops_001.html2018-05-135review_5799963772018-05-01
6571Top_HopsTop_Hops_001.html2018-05-114review_5795507572018-05-01
6572Top_HopsTop_Hops_001.html2018-04-235review_5752541622018-04-01
6573Top_HopsTop_Hops_001.html2018-03-104review_5657126812018-03-01
6574Top_HopsTop_Hops_001.html2017-11-074review_5392811412017-11-01
6575Top_HopsTop_Hops_002.html2017-10-035review_5296936502017-10-01
6576Top_HopsTop_Hops_002.html2017-09-095review_5229372542017-09-01
6577Top_HopsTop_Hops_002.html2017-06-095review_4918541862017-06-01
6578Top_HopsTop_Hops_002.html2017-05-095review_4829430312017-05-01
6579Top_HopsTop_Hops_002.html2017-04-195review_4770945582017-04-01
\n", "
" ], "text/plain": [ " bar bar_page date rating rev_id \\\n", "6565 Top_Hops Top_Hops_001.html 2018-08-23 4 review_609548126 \n", "6566 Top_Hops Top_Hops_001.html 2018-07-30 5 review_601181134 \n", "6567 Top_Hops Top_Hops_001.html 2018-07-23 2 review_599064016 \n", "6568 Top_Hops Top_Hops_001.html 2018-07-09 4 review_594774706 \n", "6569 Top_Hops Top_Hops_001.html 2018-06-11 5 review_586754368 \n", "6570 Top_Hops Top_Hops_001.html 2018-05-13 5 review_579996377 \n", "6571 Top_Hops Top_Hops_001.html 2018-05-11 4 review_579550757 \n", "6572 Top_Hops Top_Hops_001.html 2018-04-23 5 review_575254162 \n", "6573 Top_Hops Top_Hops_001.html 2018-03-10 4 review_565712681 \n", "6574 Top_Hops Top_Hops_001.html 2017-11-07 4 review_539281141 \n", "6575 Top_Hops Top_Hops_002.html 2017-10-03 5 review_529693650 \n", "6576 Top_Hops Top_Hops_002.html 2017-09-09 5 review_522937254 \n", "6577 Top_Hops Top_Hops_002.html 2017-06-09 5 review_491854186 \n", "6578 Top_Hops Top_Hops_002.html 2017-05-09 5 review_482943031 \n", "6579 Top_Hops Top_Hops_002.html 2017-04-19 5 review_477094558 \n", "\n", " first_of_month \n", "6565 2018-08-01 \n", "6566 2018-07-01 \n", "6567 2018-07-01 \n", "6568 2018-07-01 \n", "6569 2018-06-01 \n", "6570 2018-05-01 \n", "6571 2018-05-01 \n", "6572 2018-04-01 \n", "6573 2018-03-01 \n", "6574 2017-11-01 \n", "6575 2017-10-01 \n", "6576 2017-09-01 \n", "6577 2017-06-01 \n", "6578 2017-05-01 \n", "6579 2017-04-01 " ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_top_hops = df_ta_bar_reviews[df_ta_bar_reviews.bar==\"Top_Hops\"]\n", "df_top_hops.head(15)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
rating_meanrating_count
first_of_month
2018-08-014.0000001
2018-07-013.6666673
2018-06-015.0000001
2018-05-014.5000002
2018-04-015.0000001
\n", "
" ], "text/plain": [ " rating_mean rating_count\n", "first_of_month \n", "2018-08-01 4.000000 1\n", "2018-07-01 3.666667 3\n", "2018-06-01 5.000000 1\n", "2018-05-01 4.500000 2\n", "2018-04-01 5.000000 1" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_top_hops_grouped = pd.concat([df_top_hops[['first_of_month', 'rating']].groupby(['first_of_month']).mean(), \\\n", " df_top_hops[['first_of_month', 'rating']].groupby(['first_of_month']).count()], \\\n", " axis=1)\n", "\n", "df_top_hops_grouped.columns = ['rating_mean', 'rating_count']\n", "df_top_hops_grouped.sort_index(ascending=False, inplace=True)\n", "df_top_hops_grouped.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## confirmed" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "4.379194630872483" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "m_weight = pd.Series( ( df_top_hops_grouped.index.max() - df_top_hops_grouped.index ) / ( np.timedelta64(1, 'M') ) ).apply(month_weight)\n", "m_rating = df_top_hops_grouped.rating_mean.values * df_top_hops_grouped.rating_count.values\n", "m_denom = np.sum( m_weight * df_top_hops_grouped.rating_count.values )\n", "\n", "w_rating = np.sum( m_weight * m_rating ) / m_denom\n", "w_rating" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## cycle through dates/index for moving weighted rating \n", "## (ignore missing months for time being)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[4.379, 4.423, 4.653, 4.615, 4.634, 4.594, 4.669, 4.721, 4.702, 4.623]" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "moving_weighted_ratings = []\n", "\n", "for row in range(df_top_hops_grouped.shape[0]):\n", " \n", " m_weight = pd.Series((df_top_hops_grouped.iloc[row:].index.max() - df_top_hops_grouped.iloc[row:].index) / ( np.timedelta64(1, 'M') )).apply(month_weight) \n", " m_rating = df_top_hops_grouped.iloc[row:]['rating_mean'].values * df_top_hops_grouped.iloc[row:]['rating_count'].values\n", " m_denom = np.sum( m_weight * df_top_hops_grouped.iloc[row:]['rating_count'].values )\n", " \n", " w_rating = np.round( (np.sum( m_weight * m_rating ) / m_denom), 3 )\n", " moving_weighted_ratings.append( w_rating )\n", " \n", "moving_weighted_ratings[:10]" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
rating_meanrating_countmoving_weighted_ratings
first_of_month
2018-08-014.00000014.379
2018-07-013.66666734.423
2018-06-015.00000014.653
2018-05-014.50000024.615
2018-04-015.00000014.634
2018-03-014.00000014.594
2017-11-014.00000014.669
2017-10-015.00000014.721
2017-09-015.00000014.702
2017-06-015.00000014.623
\n", "
" ], "text/plain": [ " rating_mean rating_count moving_weighted_ratings\n", "first_of_month \n", "2018-08-01 4.000000 1 4.379\n", "2018-07-01 3.666667 3 4.423\n", "2018-06-01 5.000000 1 4.653\n", "2018-05-01 4.500000 2 4.615\n", "2018-04-01 5.000000 1 4.634\n", "2018-03-01 4.000000 1 4.594\n", "2017-11-01 4.000000 1 4.669\n", "2017-10-01 5.000000 1 4.721\n", "2017-09-01 5.000000 1 4.702\n", "2017-06-01 5.000000 1 4.623" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_top_hops_grouped['moving_weighted_ratings'] = moving_weighted_ratings\n", "df_top_hops_grouped.head(10)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df_top_hops_grouped.moving_weighted_ratings.plot()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## fill in missing months" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "df_top_hops_grouped = pd.concat([df_top_hops[['first_of_month', 'rating']].groupby(['first_of_month']).mean(), \\\n", " df_top_hops[['first_of_month', 'rating']].groupby(['first_of_month']).count()], \\\n", " axis=1)\n", "\n", "df_top_hops_grouped.columns = ['rating_mean', 'rating_count']" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
rating_meanrating_count
first_of_month
2013-01-014.02
2013-04-015.01
2013-06-015.01
2013-11-014.01
2013-12-014.01
\n", "
" ], "text/plain": [ " rating_mean rating_count\n", "first_of_month \n", "2013-01-01 4.0 2\n", "2013-04-01 5.0 1\n", "2013-06-01 5.0 1\n", "2013-11-01 4.0 1\n", "2013-12-01 4.0 1" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def group_ratings_by_date(df, date_field, rating_field):\n", " \n", " df_grouped = pd.concat([df[[date_field, rating_field]].groupby([date_field]).mean(), \\\n", " df[[date_field, rating_field]].groupby([date_field]).count()], \\\n", " axis=1)\n", " \n", " df_grouped.columns = ['rating_mean', 'rating_count']\n", " \n", " return df_grouped\n", "\n", "\n", "df_top_hops_grouped = group_ratings_by_date(df_top_hops, 'first_of_month', 'rating')\n", "df_top_hops_grouped.head()" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
bar
2018-08-01Top_Hops
2018-07-01Top_Hops
2018-06-01Top_Hops
2018-05-01Top_Hops
2018-04-01Top_Hops
\n", "
" ], "text/plain": [ " bar\n", "2018-08-01 Top_Hops\n", "2018-07-01 Top_Hops\n", "2018-06-01 Top_Hops\n", "2018-05-01 Top_Hops\n", "2018-04-01 Top_Hops" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def expand_dates(df, index=True, date_field=False):\n", " if index:\n", " return pd.Series(pd.date_range(df.index.min(), df.index.max().replace(month = df.index.max().month + 1), freq=\"M\")).apply(first_of_month)\n", " else:\n", " return pd.Series(pd.date_range(df[date_field].min(), df[date_field].max().replace(month = df[date_field].max().month + 1), freq=\"M\")).apply(first_of_month)\n", " \n", "\n", "expanded_date_series = expand_dates(df_top_hops_grouped)\n", "df_exp_dates = pd.DataFrame({'bar': len(expanded_date_series) * ['Top_Hops']}, index=expanded_date_series)\n", "df_exp_dates.sort_index(ascending=False, inplace=True)\n", "df_exp_dates.head()" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
barrating_meanrating_count
2018-08-01Top_Hops4.0000001.0
2018-07-01Top_Hops3.6666673.0
2018-06-01Top_Hops5.0000001.0
2018-05-01Top_Hops4.5000002.0
2018-04-01Top_Hops5.0000001.0
2018-03-01Top_Hops4.0000001.0
2018-02-01Top_Hops0.0000000.0
2018-01-01Top_Hops0.0000000.0
2017-12-01Top_Hops0.0000000.0
2017-11-01Top_Hops4.0000001.0
\n", "
" ], "text/plain": [ " bar rating_mean rating_count\n", "2018-08-01 Top_Hops 4.000000 1.0\n", "2018-07-01 Top_Hops 3.666667 3.0\n", "2018-06-01 Top_Hops 5.000000 1.0\n", "2018-05-01 Top_Hops 4.500000 2.0\n", "2018-04-01 Top_Hops 5.000000 1.0\n", "2018-03-01 Top_Hops 4.000000 1.0\n", "2018-02-01 Top_Hops 0.000000 0.0\n", "2018-01-01 Top_Hops 0.000000 0.0\n", "2017-12-01 Top_Hops 0.000000 0.0\n", "2017-11-01 Top_Hops 4.000000 1.0" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_top_hops_grouped = pd.concat([df_exp_dates, df_top_hops_grouped], axis=1).fillna(0)\n", "df_top_hops_grouped.sort_index(ascending=False, inplace=True)\n", "df_top_hops_grouped.head(10)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[4.379, 4.423, 4.653, 4.615, 4.634, 4.594, 4.67, 4.671, 4.655, 4.669]" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def moving_weighted_ratings(df):\n", "\n", " ratings = []\n", "\n", " for row in range(df.shape[0]):\n", "\n", " m_weight = pd.Series((df.iloc[row:].index.max() - df.iloc[row:].index) / ( np.timedelta64(1, 'M') )).apply(month_weight) \n", " m_rating = df.iloc[row:]['rating_mean'].values * df.iloc[row:]['rating_count'].values\n", " m_denom = np.sum( m_weight * df.iloc[row:]['rating_count'].values )\n", "\n", " w_rating = np.round( (np.sum( m_weight * m_rating ) / m_denom), 3 )\n", " ratings.append( w_rating )\n", "\n", " return ratings\n", "\n", "moving_weighted_ratings(df_top_hops_grouped)[:10]" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
barrating_meanrating_countmoving_weighted_ratings
2018-08-01Top_Hops4.0000001.04.379
2018-07-01Top_Hops3.6666673.04.423
2018-06-01Top_Hops5.0000001.04.653
2018-05-01Top_Hops4.5000002.04.615
2018-04-01Top_Hops5.0000001.04.634
2018-03-01Top_Hops4.0000001.04.594
2018-02-01Top_Hops0.0000000.04.670
2018-01-01Top_Hops0.0000000.04.671
2017-12-01Top_Hops0.0000000.04.655
2017-11-01Top_Hops4.0000001.04.669
\n", "
" ], "text/plain": [ " bar rating_mean rating_count moving_weighted_ratings\n", "2018-08-01 Top_Hops 4.000000 1.0 4.379\n", "2018-07-01 Top_Hops 3.666667 3.0 4.423\n", "2018-06-01 Top_Hops 5.000000 1.0 4.653\n", "2018-05-01 Top_Hops 4.500000 2.0 4.615\n", "2018-04-01 Top_Hops 5.000000 1.0 4.634\n", "2018-03-01 Top_Hops 4.000000 1.0 4.594\n", "2018-02-01 Top_Hops 0.000000 0.0 4.670\n", "2018-01-01 Top_Hops 0.000000 0.0 4.671\n", "2017-12-01 Top_Hops 0.000000 0.0 4.655\n", "2017-11-01 Top_Hops 4.000000 1.0 4.669" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_top_hops_grouped['moving_weighted_ratings'] = moving_weighted_ratings(df_top_hops_grouped)\n", "df_top_hops_grouped.head(10)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df_top_hops_grouped.moving_weighted_ratings.plot()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## let's run for all, merge and... " ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
p_holder
2019-06-010.0
2019-05-010.0
2019-04-010.0
2019-03-010.0
2019-02-010.0
\n", "
" ], "text/plain": [ " p_holder\n", "2019-06-01 0.0\n", "2019-05-01 0.0\n", "2019-04-01 0.0\n", "2019-03-01 0.0\n", "2019-02-01 0.0" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "all_date_series = expand_dates(df_ta_bar_reviews, False, 'first_of_month')\n", "\n", "df_all_dates = pd.DataFrame({'p_holder': np.zeros(len(all_date_series))}, index=all_date_series)\n", "df_all_dates.sort_index(ascending=False, inplace=True)\n", "df_all_dates.head()" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
barrating_meanrating_count230_Fifth
2019-06-01230_Fifth4.861789123.04.457
2019-05-01230_Fifth4.67567674.04.255
2019-04-01230_Fifth4.77777854.04.087
2019-03-01230_Fifth3.18181811.03.856
2019-02-01230_Fifth3.85714314.03.905
2019-01-01230_Fifth3.38461513.03.913
2018-12-01230_Fifth3.60000015.03.956
2018-11-01230_Fifth4.5000008.03.985
2018-10-01230_Fifth4.00000015.03.954
2018-09-01230_Fifth3.93333315.03.949
\n", "
" ], "text/plain": [ " bar rating_mean rating_count 230_Fifth\n", "2019-06-01 230_Fifth 4.861789 123.0 4.457\n", "2019-05-01 230_Fifth 4.675676 74.0 4.255\n", "2019-04-01 230_Fifth 4.777778 54.0 4.087\n", "2019-03-01 230_Fifth 3.181818 11.0 3.856\n", "2019-02-01 230_Fifth 3.857143 14.0 3.905\n", "2019-01-01 230_Fifth 3.384615 13.0 3.913\n", "2018-12-01 230_Fifth 3.600000 15.0 3.956\n", "2018-11-01 230_Fifth 4.500000 8.0 3.985\n", "2018-10-01 230_Fifth 4.000000 15.0 3.954\n", "2018-09-01 230_Fifth 3.933333 15.0 3.949" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_bar_grouped = group_ratings_by_date(df_ta_bar_reviews[df_ta_bar_reviews.bar=='230_Fifth'], 'first_of_month', 'rating')\n", "\n", "expanded_date_series = expand_dates(df_bar_grouped)\n", "df_exp_dates = pd.DataFrame({'bar': len(expanded_date_series) * ['230_Fifth']}, index=expanded_date_series)\n", "\n", "df_bar_grouped = pd.concat([df_exp_dates, df_bar_grouped], axis=1).fillna(0)\n", "df_bar_grouped.sort_index(ascending=False, inplace=True)\n", "\n", "df_bar_grouped['230_Fifth'] = moving_weighted_ratings(df_bar_grouped)\n", "df_bar_grouped.head(10)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
barrating_meanrating_count230_Fifth
2019-06-01230_Fifth4.861789123.04.457
2019-05-01230_Fifth4.67567674.04.255
2019-04-01230_Fifth4.77777854.04.087
2019-03-01230_Fifth3.18181811.03.856
2019-02-01230_Fifth3.85714314.03.905
2019-01-01230_Fifth3.38461513.03.913
2018-12-01230_Fifth3.60000015.03.956
2018-11-01230_Fifth4.5000008.03.985
2018-10-01230_Fifth4.00000015.03.954
2018-09-01230_Fifth3.93333315.03.949
\n", "
" ], "text/plain": [ " bar rating_mean rating_count 230_Fifth\n", "2019-06-01 230_Fifth 4.861789 123.0 4.457\n", "2019-05-01 230_Fifth 4.675676 74.0 4.255\n", "2019-04-01 230_Fifth 4.777778 54.0 4.087\n", "2019-03-01 230_Fifth 3.181818 11.0 3.856\n", "2019-02-01 230_Fifth 3.857143 14.0 3.905\n", "2019-01-01 230_Fifth 3.384615 13.0 3.913\n", "2018-12-01 230_Fifth 3.600000 15.0 3.956\n", "2018-11-01 230_Fifth 4.500000 8.0 3.985\n", "2018-10-01 230_Fifth 4.000000 15.0 3.954\n", "2018-09-01 230_Fifth 3.933333 15.0 3.949" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def bar_moving_weighted_ratings(df, bar_field, bar_name, date_field, rating_field):\n", "\n", " df_bar_grouped = group_ratings_by_date(df[df[bar_field] == bar_name], date_field, rating_field)\n", "\n", " expanded_date_series = expand_dates(df_bar_grouped)\n", " df_exp_dates = pd.DataFrame({'bar': len(expanded_date_series) * [bar_name]}, index=expanded_date_series)\n", "\n", " df_bar_grouped = pd.concat([df_exp_dates, df_bar_grouped], axis=1).fillna(0)\n", " df_bar_grouped.sort_index(ascending=False, inplace=True)\n", "\n", " df_bar_grouped[bar_name] = moving_weighted_ratings(df_bar_grouped)\n", " return df_bar_grouped\n", " \n", "bar_moving_weighted_ratings(df_ta_bar_reviews, 'bar', '230_Fifth', 'first_of_month', 'rating').head(10)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "230_Fifth \t 4.457\n", "Beer_Authority \t 3.831\n", "Beer_Culture \t 4.468\n", "Blind_Tiger_Ale_House \t 4.471\n", "Broome_Street_Bar \t 4.412\n", "Buddha_Beer_Bar \t 2.632\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\rstancut\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\ipykernel_launcher.py:11: RuntimeWarning: invalid value encountered in double_scalars\n", " # This is added back by InteractiveShellApp.init_path()\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Dalton_s_Bar_Grill \t 4.492\n", "Earl_s_Beer_and_Cheese \t 3.801\n", "Houston_Hall \t 4.298\n", "Jeremy_s_Ale_House \t 4.313\n", "Jimmy_s_Corner \t 4.362\n", "Kiabacca_Bar \t 4.797\n", "Loreley_Beer_Garden \t 3.747\n", "Mercury_Bar \t 4.567\n", "Mr_Biggs_Bar_Grill \t 3.802\n", "New_York_Beer_Company \t 4.264\n", "Old_Town_Bar \t 3.829\n", "O_Reilly_s_Bar_Kitchen \t 4.457\n", "Randolph_Beer \t 3.653\n", "Rattle_and_Hum \t 4.142\n", "Sean_s_Bar_And_Kitchen \t 4.416\n", "Social_Bar \t 4.115\n", "Taproom_307 \t 4.195\n", "The_Cannibal_Beer_Butcher \t 3.706\n", "The_Ginger_Man \t 3.998\n", "The_House_of_Brews \t 4.274\n", "The_Jeffrey_Craft_Beer_Bar_and_Bites \t 4.634\n", "The_Three_Monkeys \t 4.36\n", "Top_Hops \t 4.379\n", "Valhalla \t 4.4\n" ] } ], "source": [ "for b in df_ta_bar_reviews.bar.unique():\n", " df_bar_moving_weighted_ratings = bar_moving_weighted_ratings(df_ta_bar_reviews, 'bar', b, 'first_of_month', 'rating')\n", " print(b, '\\t', df_bar_moving_weighted_ratings[b][0])\n", " df_all_dates = pd.concat([df_all_dates, df_bar_moving_weighted_ratings[b]], axis=1).fillna(0)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
p_holder230_FifthBeer_AuthorityBeer_CultureBlind_Tiger_Ale_HouseBroome_Street_BarBuddha_Beer_BarDalton_s_Bar_GrillEarl_s_Beer_and_CheeseHouston_Hall...Sean_s_Bar_And_KitchenSocial_BarTaproom_307The_Cannibal_Beer_ButcherThe_Ginger_ManThe_House_of_BrewsThe_Jeffrey_Craft_Beer_Bar_and_BitesThe_Three_MonkeysTop_HopsValhalla
2019-06-010.04.4573.8314.4684.4710.0002.6324.4920.0000.000...4.4160.0000.0000.0003.9984.2744.6344.3600.0000.000
2019-05-010.04.2553.8944.4364.4394.4123.8334.4573.8010.000...4.3950.0004.1950.0004.0464.2314.6024.3470.0000.000
2019-04-010.04.0873.8774.4434.4334.4033.8464.3754.3110.000...4.3754.1154.2000.0004.1494.2384.6144.3360.0004.400
2019-03-010.03.8563.9054.4894.4334.4053.8574.3804.5590.000...4.3564.0504.1783.7064.1404.2424.6044.3160.0004.351
2019-02-010.03.9053.8864.5534.5194.4063.6324.3804.6780.000...4.3553.9824.3123.6944.1404.2724.5544.3190.0004.351
2019-01-010.03.9133.9124.4784.4174.4603.6674.4034.6764.298...4.3343.9924.2823.7114.0654.2864.5594.3530.0004.309
2018-12-010.03.9563.9644.4014.3004.4563.7504.3404.6584.220...4.3503.9934.2683.6633.9974.2904.5664.3400.0004.326
2018-11-010.03.9853.9814.3474.2744.4643.8154.3674.6594.214...4.3623.9254.2923.7974.0084.3384.5164.3190.0004.302
2018-10-010.03.9543.9904.3554.2984.4033.9064.3684.6404.221...4.3713.9264.1013.8144.0974.3164.5114.2620.0004.306
2018-09-010.03.9494.0394.3184.2874.4253.9144.3544.6394.437...4.3583.9144.0913.8194.0744.3174.5444.2210.0004.227
2018-08-010.03.9433.9954.4564.3104.4164.0234.3584.6264.419...4.3183.9724.1013.8334.0864.3084.5314.2444.3794.234
2018-07-010.03.9184.0004.4364.3254.3634.0804.4084.6234.412...4.2903.9114.0793.9854.1034.3694.5224.2664.4234.318
2018-06-010.03.9324.0024.4984.3454.3394.1234.3324.6084.399...4.2093.8324.0863.9434.1134.3594.5174.2604.6534.350
2018-05-010.03.9193.9904.4274.4614.3394.1544.4714.5924.279...4.1943.8484.0923.9564.1274.3534.6204.2544.6154.366
2018-04-010.03.8884.0194.4294.4624.3424.1784.4524.5744.425...4.2253.8584.1044.1074.1384.3484.6094.2394.6344.373
2018-03-010.03.8984.0124.4264.5594.3664.1984.4494.4944.406...4.2283.8654.1154.1214.1214.3404.5754.2394.5944.280
2018-02-010.03.8894.0004.4994.5434.3504.1984.4494.4574.406...4.2224.0204.1204.1224.1824.3834.5754.2234.6704.297
2018-01-010.03.8754.0094.4984.5104.3424.6884.4544.4404.385...4.1594.1994.0534.1034.2154.3464.5384.2414.6714.288
2017-12-010.03.8823.9834.5554.4934.3714.6714.4174.3344.196...4.1534.1944.1474.0904.2694.3134.5574.2464.6554.262
2017-11-010.03.8694.0144.4914.5124.3434.6674.4164.3264.194...4.2864.1654.0764.2054.2224.2804.5584.2834.6694.255
\n", "

20 rows × 31 columns

\n", "
" ], "text/plain": [ " p_holder 230_Fifth Beer_Authority Beer_Culture \\\n", "2019-06-01 0.0 4.457 3.831 4.468 \n", "2019-05-01 0.0 4.255 3.894 4.436 \n", "2019-04-01 0.0 4.087 3.877 4.443 \n", "2019-03-01 0.0 3.856 3.905 4.489 \n", "2019-02-01 0.0 3.905 3.886 4.553 \n", "2019-01-01 0.0 3.913 3.912 4.478 \n", "2018-12-01 0.0 3.956 3.964 4.401 \n", "2018-11-01 0.0 3.985 3.981 4.347 \n", "2018-10-01 0.0 3.954 3.990 4.355 \n", "2018-09-01 0.0 3.949 4.039 4.318 \n", "2018-08-01 0.0 3.943 3.995 4.456 \n", "2018-07-01 0.0 3.918 4.000 4.436 \n", "2018-06-01 0.0 3.932 4.002 4.498 \n", "2018-05-01 0.0 3.919 3.990 4.427 \n", "2018-04-01 0.0 3.888 4.019 4.429 \n", "2018-03-01 0.0 3.898 4.012 4.426 \n", "2018-02-01 0.0 3.889 4.000 4.499 \n", "2018-01-01 0.0 3.875 4.009 4.498 \n", "2017-12-01 0.0 3.882 3.983 4.555 \n", "2017-11-01 0.0 3.869 4.014 4.491 \n", "\n", " Blind_Tiger_Ale_House Broome_Street_Bar Buddha_Beer_Bar \\\n", "2019-06-01 4.471 0.000 2.632 \n", "2019-05-01 4.439 4.412 3.833 \n", "2019-04-01 4.433 4.403 3.846 \n", "2019-03-01 4.433 4.405 3.857 \n", "2019-02-01 4.519 4.406 3.632 \n", "2019-01-01 4.417 4.460 3.667 \n", "2018-12-01 4.300 4.456 3.750 \n", "2018-11-01 4.274 4.464 3.815 \n", "2018-10-01 4.298 4.403 3.906 \n", "2018-09-01 4.287 4.425 3.914 \n", "2018-08-01 4.310 4.416 4.023 \n", "2018-07-01 4.325 4.363 4.080 \n", "2018-06-01 4.345 4.339 4.123 \n", "2018-05-01 4.461 4.339 4.154 \n", "2018-04-01 4.462 4.342 4.178 \n", "2018-03-01 4.559 4.366 4.198 \n", "2018-02-01 4.543 4.350 4.198 \n", "2018-01-01 4.510 4.342 4.688 \n", "2017-12-01 4.493 4.371 4.671 \n", "2017-11-01 4.512 4.343 4.667 \n", "\n", " Dalton_s_Bar_Grill Earl_s_Beer_and_Cheese Houston_Hall \\\n", "2019-06-01 4.492 0.000 0.000 \n", "2019-05-01 4.457 3.801 0.000 \n", "2019-04-01 4.375 4.311 0.000 \n", "2019-03-01 4.380 4.559 0.000 \n", "2019-02-01 4.380 4.678 0.000 \n", "2019-01-01 4.403 4.676 4.298 \n", "2018-12-01 4.340 4.658 4.220 \n", "2018-11-01 4.367 4.659 4.214 \n", "2018-10-01 4.368 4.640 4.221 \n", "2018-09-01 4.354 4.639 4.437 \n", "2018-08-01 4.358 4.626 4.419 \n", "2018-07-01 4.408 4.623 4.412 \n", "2018-06-01 4.332 4.608 4.399 \n", "2018-05-01 4.471 4.592 4.279 \n", "2018-04-01 4.452 4.574 4.425 \n", "2018-03-01 4.449 4.494 4.406 \n", "2018-02-01 4.449 4.457 4.406 \n", "2018-01-01 4.454 4.440 4.385 \n", "2017-12-01 4.417 4.334 4.196 \n", "2017-11-01 4.416 4.326 4.194 \n", "\n", " ... Sean_s_Bar_And_Kitchen Social_Bar Taproom_307 \\\n", "2019-06-01 ... 4.416 0.000 0.000 \n", "2019-05-01 ... 4.395 0.000 4.195 \n", "2019-04-01 ... 4.375 4.115 4.200 \n", "2019-03-01 ... 4.356 4.050 4.178 \n", "2019-02-01 ... 4.355 3.982 4.312 \n", "2019-01-01 ... 4.334 3.992 4.282 \n", "2018-12-01 ... 4.350 3.993 4.268 \n", "2018-11-01 ... 4.362 3.925 4.292 \n", "2018-10-01 ... 4.371 3.926 4.101 \n", "2018-09-01 ... 4.358 3.914 4.091 \n", "2018-08-01 ... 4.318 3.972 4.101 \n", "2018-07-01 ... 4.290 3.911 4.079 \n", "2018-06-01 ... 4.209 3.832 4.086 \n", "2018-05-01 ... 4.194 3.848 4.092 \n", "2018-04-01 ... 4.225 3.858 4.104 \n", "2018-03-01 ... 4.228 3.865 4.115 \n", "2018-02-01 ... 4.222 4.020 4.120 \n", "2018-01-01 ... 4.159 4.199 4.053 \n", "2017-12-01 ... 4.153 4.194 4.147 \n", "2017-11-01 ... 4.286 4.165 4.076 \n", "\n", " The_Cannibal_Beer_Butcher The_Ginger_Man The_House_of_Brews \\\n", "2019-06-01 0.000 3.998 4.274 \n", "2019-05-01 0.000 4.046 4.231 \n", "2019-04-01 0.000 4.149 4.238 \n", "2019-03-01 3.706 4.140 4.242 \n", "2019-02-01 3.694 4.140 4.272 \n", "2019-01-01 3.711 4.065 4.286 \n", "2018-12-01 3.663 3.997 4.290 \n", "2018-11-01 3.797 4.008 4.338 \n", "2018-10-01 3.814 4.097 4.316 \n", "2018-09-01 3.819 4.074 4.317 \n", "2018-08-01 3.833 4.086 4.308 \n", "2018-07-01 3.985 4.103 4.369 \n", "2018-06-01 3.943 4.113 4.359 \n", "2018-05-01 3.956 4.127 4.353 \n", "2018-04-01 4.107 4.138 4.348 \n", "2018-03-01 4.121 4.121 4.340 \n", "2018-02-01 4.122 4.182 4.383 \n", "2018-01-01 4.103 4.215 4.346 \n", "2017-12-01 4.090 4.269 4.313 \n", "2017-11-01 4.205 4.222 4.280 \n", "\n", " The_Jeffrey_Craft_Beer_Bar_and_Bites The_Three_Monkeys Top_Hops \\\n", "2019-06-01 4.634 4.360 0.000 \n", "2019-05-01 4.602 4.347 0.000 \n", "2019-04-01 4.614 4.336 0.000 \n", "2019-03-01 4.604 4.316 0.000 \n", "2019-02-01 4.554 4.319 0.000 \n", "2019-01-01 4.559 4.353 0.000 \n", "2018-12-01 4.566 4.340 0.000 \n", "2018-11-01 4.516 4.319 0.000 \n", "2018-10-01 4.511 4.262 0.000 \n", "2018-09-01 4.544 4.221 0.000 \n", "2018-08-01 4.531 4.244 4.379 \n", "2018-07-01 4.522 4.266 4.423 \n", "2018-06-01 4.517 4.260 4.653 \n", "2018-05-01 4.620 4.254 4.615 \n", "2018-04-01 4.609 4.239 4.634 \n", "2018-03-01 4.575 4.239 4.594 \n", "2018-02-01 4.575 4.223 4.670 \n", "2018-01-01 4.538 4.241 4.671 \n", "2017-12-01 4.557 4.246 4.655 \n", "2017-11-01 4.558 4.283 4.669 \n", "\n", " Valhalla \n", "2019-06-01 0.000 \n", "2019-05-01 0.000 \n", "2019-04-01 4.400 \n", "2019-03-01 4.351 \n", "2019-02-01 4.351 \n", "2019-01-01 4.309 \n", "2018-12-01 4.326 \n", "2018-11-01 4.302 \n", "2018-10-01 4.306 \n", "2018-09-01 4.227 \n", "2018-08-01 4.234 \n", "2018-07-01 4.318 \n", "2018-06-01 4.350 \n", "2018-05-01 4.366 \n", "2018-04-01 4.373 \n", "2018-03-01 4.280 \n", "2018-02-01 4.297 \n", "2018-01-01 4.288 \n", "2017-12-01 4.262 \n", "2017-11-01 4.255 \n", "\n", "[20 rows x 31 columns]" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_all_dates.sort_index(ascending=False, inplace=True)\n", "df_all_dates.head(20)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "# df_all_dates.to_excel('ta_bar_reviews_weighted_moving_avg.xlsx')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## need to concat each bar on entire date range first and then work backwards in ratings, this will remove sudden zeroes in June" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\rstancut\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\ipykernel_launcher.py:11: RuntimeWarning: invalid value encountered in double_scalars\n", " # This is added back by InteractiveShellApp.init_path()\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
barrating_meanrating_countEarl_s_Beer_and_Cheese
2019-06-01Earl_s_Beer_and_Cheese0.00.03.746
2019-05-01Earl_s_Beer_and_Cheese1.01.03.801
2019-04-01Earl_s_Beer_and_Cheese3.01.04.311
2019-03-01Earl_s_Beer_and_Cheese4.01.04.559
2019-02-01Earl_s_Beer_and_Cheese0.00.04.678
2019-01-01Earl_s_Beer_and_Cheese0.00.04.676
2018-12-01Earl_s_Beer_and_Cheese0.00.04.658
2018-11-01Earl_s_Beer_and_Cheese0.00.04.659
2018-10-01Earl_s_Beer_and_Cheese0.00.04.640
2018-09-01Earl_s_Beer_and_Cheese0.00.04.639
\n", "
" ], "text/plain": [ " bar rating_mean rating_count \\\n", "2019-06-01 Earl_s_Beer_and_Cheese 0.0 0.0 \n", "2019-05-01 Earl_s_Beer_and_Cheese 1.0 1.0 \n", "2019-04-01 Earl_s_Beer_and_Cheese 3.0 1.0 \n", "2019-03-01 Earl_s_Beer_and_Cheese 4.0 1.0 \n", "2019-02-01 Earl_s_Beer_and_Cheese 0.0 0.0 \n", "2019-01-01 Earl_s_Beer_and_Cheese 0.0 0.0 \n", "2018-12-01 Earl_s_Beer_and_Cheese 0.0 0.0 \n", "2018-11-01 Earl_s_Beer_and_Cheese 0.0 0.0 \n", "2018-10-01 Earl_s_Beer_and_Cheese 0.0 0.0 \n", "2018-09-01 Earl_s_Beer_and_Cheese 0.0 0.0 \n", "\n", " Earl_s_Beer_and_Cheese \n", "2019-06-01 3.746 \n", "2019-05-01 3.801 \n", "2019-04-01 4.311 \n", "2019-03-01 4.559 \n", "2019-02-01 4.678 \n", "2019-01-01 4.676 \n", "2018-12-01 4.658 \n", "2018-11-01 4.659 \n", "2018-10-01 4.640 \n", "2018-09-01 4.639 " ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def bar_moving_weighted_ratings_macro_date_range(df, bar_field, bar_name, date_field, rating_field):\n", "\n", " df_bar_grouped = group_ratings_by_date(df[df[bar_field] == bar_name], date_field, rating_field)\n", " \n", " # change 1\n", " df_macro_dates_grouped = group_ratings_by_date(df, date_field, rating_field)\n", "\n", " # change 2\n", " expanded_date_series = expand_dates(df_macro_dates_grouped)\n", " df_exp_dates = pd.DataFrame({'bar': len(expanded_date_series) * [bar_name]}, index=expanded_date_series)\n", "\n", " df_bar_grouped = pd.concat([df_exp_dates, df_bar_grouped], axis=1).fillna(0)\n", " df_bar_grouped.sort_index(ascending=False, inplace=True)\n", "\n", " df_bar_grouped[bar_name] = moving_weighted_ratings(df_bar_grouped)\n", " return df_bar_grouped\n", " \n", "bar_moving_weighted_ratings_macro_date_range(df_ta_bar_reviews, 'bar', 'Earl_s_Beer_and_Cheese', 'first_of_month', 'rating').head(10)" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\rstancut\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\ipykernel_launcher.py:11: RuntimeWarning: invalid value encountered in double_scalars\n", " # This is added back by InteractiveShellApp.init_path()\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "230_Fifth \t 4.457\n", "Beer_Authority \t 3.831\n", "Beer_Culture \t 4.468\n", "Blind_Tiger_Ale_House \t 4.471\n", "Broome_Street_Bar \t 4.412\n", "Buddha_Beer_Bar \t 2.632\n", "Dalton_s_Bar_Grill \t 4.492\n", "Earl_s_Beer_and_Cheese \t 3.746\n", "Houston_Hall \t 4.281\n", "Jeremy_s_Ale_House \t 4.313\n", "Jimmy_s_Corner \t 4.352\n", "Kiabacca_Bar \t 4.803\n", "Loreley_Beer_Garden \t 3.753\n", "Mercury_Bar \t 4.567\n", "Mr_Biggs_Bar_Grill \t 3.824\n", "New_York_Beer_Company \t 4.264\n", "Old_Town_Bar \t 3.829\n", "O_Reilly_s_Bar_Kitchen \t 4.449\n", "Randolph_Beer \t 3.654\n", "Rattle_and_Hum \t 4.174\n", "Sean_s_Bar_And_Kitchen \t 4.416\n", "Social_Bar \t 4.131\n", "Taproom_307 \t 4.185\n", "The_Cannibal_Beer_Butcher \t 3.673\n", "The_Ginger_Man \t 3.998\n", "The_House_of_Brews \t 4.274\n", "The_Jeffrey_Craft_Beer_Bar_and_Bites \t 4.634\n", "The_Three_Monkeys \t 4.36\n", "Top_Hops \t 4.256\n", "Valhalla \t 4.412\n" ] } ], "source": [ "all_date_series = expand_dates(df_ta_bar_reviews, False, 'first_of_month')\n", "\n", "df_all_dates = pd.DataFrame({'p_holder': np.zeros(len(all_date_series))}, index=all_date_series)\n", "df_all_dates.sort_index(ascending=False, inplace=True)\n", "# df_all_dates.head()\n", "\n", "for b in df_ta_bar_reviews.bar.unique():\n", " df_bar_moving_weighted_ratings = bar_moving_weighted_ratings_macro_date_range(df_ta_bar_reviews, 'bar', b, 'first_of_month', 'rating')\n", " print(b, '\\t', df_bar_moving_weighted_ratings[b][0])\n", " df_all_dates = pd.concat([df_all_dates, df_bar_moving_weighted_ratings[b]], axis=1).fillna(0)" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
p_holder230_FifthBeer_AuthorityBeer_CultureBlind_Tiger_Ale_HouseBroome_Street_BarBuddha_Beer_BarDalton_s_Bar_GrillEarl_s_Beer_and_CheeseHouston_Hall...Sean_s_Bar_And_KitchenSocial_BarTaproom_307The_Cannibal_Beer_ButcherThe_Ginger_ManThe_House_of_BrewsThe_Jeffrey_Craft_Beer_Bar_and_BitesThe_Three_MonkeysTop_HopsValhalla
2019-06-010.04.4573.8314.4684.4714.4122.6324.4923.7464.281...4.4164.1314.1853.6733.9984.2744.6344.3604.2564.412
2019-05-010.04.2553.8944.4364.4394.4123.8334.4573.8014.283...4.3954.1184.1953.6894.0464.2314.6024.3474.2624.405
2019-04-010.04.0873.8774.4434.4334.4033.8464.3754.3114.294...4.3754.1154.2003.7034.1494.2384.6144.3364.2924.400
2019-03-010.03.8563.9054.4894.4334.4053.8574.3804.5594.293...4.3564.0504.1783.7064.1404.2424.6044.3164.3014.351
2019-02-010.03.9053.8864.5534.5194.4063.6324.3804.6784.293...4.3553.9824.3123.6944.1404.2724.5544.3194.3014.351
\n", "

5 rows × 31 columns

\n", "
" ], "text/plain": [ " p_holder 230_Fifth Beer_Authority Beer_Culture \\\n", "2019-06-01 0.0 4.457 3.831 4.468 \n", "2019-05-01 0.0 4.255 3.894 4.436 \n", "2019-04-01 0.0 4.087 3.877 4.443 \n", "2019-03-01 0.0 3.856 3.905 4.489 \n", "2019-02-01 0.0 3.905 3.886 4.553 \n", "\n", " Blind_Tiger_Ale_House Broome_Street_Bar Buddha_Beer_Bar \\\n", "2019-06-01 4.471 4.412 2.632 \n", "2019-05-01 4.439 4.412 3.833 \n", "2019-04-01 4.433 4.403 3.846 \n", "2019-03-01 4.433 4.405 3.857 \n", "2019-02-01 4.519 4.406 3.632 \n", "\n", " Dalton_s_Bar_Grill Earl_s_Beer_and_Cheese Houston_Hall \\\n", "2019-06-01 4.492 3.746 4.281 \n", "2019-05-01 4.457 3.801 4.283 \n", "2019-04-01 4.375 4.311 4.294 \n", "2019-03-01 4.380 4.559 4.293 \n", "2019-02-01 4.380 4.678 4.293 \n", "\n", " ... Sean_s_Bar_And_Kitchen Social_Bar Taproom_307 \\\n", "2019-06-01 ... 4.416 4.131 4.185 \n", "2019-05-01 ... 4.395 4.118 4.195 \n", "2019-04-01 ... 4.375 4.115 4.200 \n", "2019-03-01 ... 4.356 4.050 4.178 \n", "2019-02-01 ... 4.355 3.982 4.312 \n", "\n", " The_Cannibal_Beer_Butcher The_Ginger_Man The_House_of_Brews \\\n", "2019-06-01 3.673 3.998 4.274 \n", "2019-05-01 3.689 4.046 4.231 \n", "2019-04-01 3.703 4.149 4.238 \n", "2019-03-01 3.706 4.140 4.242 \n", "2019-02-01 3.694 4.140 4.272 \n", "\n", " The_Jeffrey_Craft_Beer_Bar_and_Bites The_Three_Monkeys Top_Hops \\\n", "2019-06-01 4.634 4.360 4.256 \n", "2019-05-01 4.602 4.347 4.262 \n", "2019-04-01 4.614 4.336 4.292 \n", "2019-03-01 4.604 4.316 4.301 \n", "2019-02-01 4.554 4.319 4.301 \n", "\n", " Valhalla \n", "2019-06-01 4.412 \n", "2019-05-01 4.405 \n", "2019-04-01 4.400 \n", "2019-03-01 4.351 \n", "2019-02-01 4.351 \n", "\n", "[5 rows x 31 columns]" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_all_dates.sort_index(ascending=False, inplace=True)\n", "df_all_dates.head()" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [], "source": [ "# df_all_dates.to_excel('ta_bar_reviews_weighted_moving_avg_macro_date_range.xlsx')" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df_all_dates.Broome_Street_Bar.plot()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## some bars go for several months w/o reviews, perhaps suspend rating after n-months" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.4" } }, "nbformat": 4, "nbformat_minor": 2 }