rufimelo commited on
Commit
8724d8b
·
1 Parent(s): 41173b4
.DS_Store CHANGED
Binary files a/.DS_Store and b/.DS_Store differ
 
app/__pycache__/core.cpython-310.pyc CHANGED
Binary files a/app/__pycache__/core.cpython-310.pyc and b/app/__pycache__/core.cpython-310.pyc differ
 
app/app.py CHANGED
@@ -6,9 +6,9 @@ from dash import Dash, html, dcc, Input, Output, callback
6
  import plotly.express as px
7
  import numpy as np
8
  from plotly.subplots import make_subplots
 
9
 
10
  df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/gapminder_unfiltered.csv')
11
-
12
  debug = False
13
 
14
  external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']
@@ -23,13 +23,28 @@ app.layout = html.Div([
23
  server = app.server
24
 
25
 
 
 
 
 
 
 
 
 
 
 
 
26
  dashboard_layout = html.Div([
27
  dcc.Link('About this project', href='/wiki'),
28
 
29
- html.H1(children='Title of Dash App', style={'textAlign':'center'}),
30
- dcc.Dropdown(df.country.unique(), 'Canada', id='dropdown-selection'),
31
- dcc.Graph(id='graph-content')
32
 
 
 
 
 
 
33
  ])
34
 
35
 
@@ -85,11 +100,16 @@ def display_page(pathname):
85
 
86
  @app.callback(
87
  Output('graph-content', 'figure'),
 
88
  Input('dropdown-selection', 'value')
89
  )
90
  def update_graph(value):
91
- dff = df[df.country==value]
92
- return px.line(dff, x='year', y='pop')
 
 
 
 
93
 
94
 
95
  if __name__ == "__main__":
 
6
  import plotly.express as px
7
  import numpy as np
8
  from plotly.subplots import make_subplots
9
+ import core
10
 
11
  df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/gapminder_unfiltered.csv')
 
12
  debug = False
13
 
14
  external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']
 
23
  server = app.server
24
 
25
 
26
+ wine_similarity_df = pd.read_csv('data/wine_similarity.csv')
27
+ wine_list = wine_similarity_df['NAME'].unique()
28
+
29
+
30
+
31
+
32
+
33
+
34
+
35
+ ## Layout ##
36
+
37
  dashboard_layout = html.Div([
38
  dcc.Link('About this project', href='/wiki'),
39
 
40
+ dcc.Graph(id='graph-content'),
41
+
 
42
 
43
+
44
+
45
+ html.H1(children='Wine Recommender', style={'textAlign':'center'}),
46
+ dcc.Dropdown(wine_list, wine_list[0], id='dropdown-selection'),
47
+ html.Div(id='wine-recommendation', children=''),
48
  ])
49
 
50
 
 
100
 
101
  @app.callback(
102
  Output('graph-content', 'figure'),
103
+ Output('wine-recommendation', 'children'),
104
  Input('dropdown-selection', 'value')
105
  )
106
  def update_graph(value):
107
+ recommended_wines = None
108
+ if value:
109
+ recommended_wines = core.get_top_5_similar_wines(value, wine_similarity_df)[1:]
110
+ recommended_wines = "; ".join(recommended_wines)
111
+
112
+ return px.line(df, x='year', y='pop'), recommended_wines
113
 
114
 
115
  if __name__ == "__main__":
app/core.py CHANGED
@@ -1,99 +1,13 @@
1
- # Electric cost(Euros) = energy_price(Euros/kWh) * wasted_energy(kWh)
2
- def custo(energy_price_hour, wasted_energy):
3
- return energy_price_hour * wasted_energy
4
-
5
-
6
- # caldeira 20 litros
7
- def spent_energy(
8
- temperatura_inicial_caldeira_t, # existente na cadeira, t sendo a hora
9
- temperatura_objetivo_caldeira_t_plus_1,
10
- outside_temp,
11
- pressao_caldeira,
12
- litros_gastos_no_banho=0,
13
- temperatura_entrada_agua_na_caldeira=15, # Temperatura ambiente da iNOVA
14
- capacidade_caldeira=20, # 20 litros
15
- ):
16
- # E = (4.2 kJ/kgoC) ((90 oC) - (20 oC)) (1000 liter) (1 kg/liter)
17
- # cp = specific heat of water (kJ/kgoC, Btu/lb oF) (4.2 kJ/kgoC, 1 Btu/lbmoF for water)
18
- heat_capacity = 4.2
19
- # Energy = heat_capacity * (temperatura_saida_agua_na_caldeira - outside_temp) * capacidade_caldeira * 1\
20
- delta_t = temperatura_objetivo_caldeira_t_plus_1 - temperatura_inicial_caldeira_t
21
-
22
- energy = (
23
- heat_capacity
24
- * (delta_t - outside_temp)
25
- * (capacidade_caldeira - litros_gastos_no_banho)
26
- * 1
27
- ) # isto vai ser minimo
28
-
29
- delta_t = (
30
- temperatura_objetivo_caldeira_t_plus_1 - temperatura_entrada_agua_na_caldeira
31
  )
32
- energy_incoming_water = (
33
- heat_capacity * (delta_t - outside_temp) * litros_gastos_no_banho * 1
34
- )
35
-
36
- # 20 Litros totais
37
- # Joao gatou 5 litros
38
- # Gastar energia em:
39
- # 15 litros para manter a temperatura da caldeira -> minimo
40
- # 5 litros para aquecer a agua que entra
41
-
42
- total_energy = energy + energy_incoming_water
43
-
44
- # TODO: Correlação entre pressão e temperatura
45
- # https://www.engineeringtoolbox.com/boiling-points-water-altitude-d_1344.html
46
- # https://www.engineeringtoolbox.com/boiling-point-water-d_926.html
47
- """
48
- That depends on whether the pressure is held constant during the heating. If there is a relief valve which maintains
49
- constant pressure as the water heats, then no, the 2 samples will heat at the same rate. However, if the pressurised sample
50
- has no pressure relief, then it will heat faster because the pressure will increase, and that increase in pressure will increase
51
- the heat in addition to the heat applied.
52
- """
53
- # kJ
54
-
55
- # TODO: FIND WHAT SHOULD BE THE RELATION BETWEEN TEMPERATURE OF OUTGOING WATER AND BOILER TEMPERATURE
56
- temperatura_saida_agua_na_caldeira = temperatura_objetivo_caldeira_t_plus_1 * 0.87
57
-
58
- return total_energy, temperatura_saida_agua_na_caldeira
59
-
60
-
61
- def calculate_weights_for_all_hours(
62
- temperatura_inicial_caldeira,
63
- temperatura_objetivo_caldeira,
64
- outside_temp,
65
- pressao_caldeira,
66
- litros_gastos_no_banho,
67
- temperatura_entrada_agua_na_caldeira,
68
- capacidade_caldeira,
69
- ):
70
- weights = []
71
- temperatures = []
72
- for i in range(len(temperatura_inicial_caldeira)):
73
- energy, temperature_water = spent_energy(
74
- temperatura_inicial_caldeira_t=temperatura_inicial_caldeira[i],
75
- temperatura_objetivo_caldeira_t_plus_1=temperatura_objetivo_caldeira,
76
- outside_temp=outside_temp[i],
77
- pressao_caldeira=pressao_caldeira[i],
78
- litros_gastos_no_banho=litros_gastos_no_banho,
79
- temperatura_entrada_agua_na_caldeira=temperatura_entrada_agua_na_caldeira[
80
- i
81
- ],
82
- capacidade_caldeira=capacidade_caldeira,
83
- )
84
- weights.append(energy)
85
- temperatures.append(temperature_water)
86
- return weights, temperatures
87
- # Output energy wasted
88
-
89
-
90
- def calculate_confort(temperatura_given, temperatura_ideal):
91
- return abs(temperatura_given - temperatura_ideal)
92
-
93
-
94
- # create exception for no solution found
95
- class NoSolutionFound(Exception):
96
- pass
97
 
98
- class SoltionFoundWithLargerConfortValue(Exception):
99
- pass
 
1
+ import pandas as pd
2
+ from sklearn.metrics.pairwise import cosine_similarity
3
+ def get_top_5_similar_wines(wine_name: str, df: pd.DataFrame) -> pd.DataFrame:
4
+ wine_row = df[df["NAME"] == wine_name].drop(columns=["NAME", "cluster"])
5
+ cosine_similarities = cosine_similarity(
6
+ wine_row, df.drop(columns=["NAME", "cluster"])
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7
  )
8
+ top_5_indices = cosine_similarities[0].argsort()[-6:-1]
9
+ res = df.iloc[top_5_indices][["NAME"]]
10
+ # Convert to list
11
+ res = res["NAME"].values.tolist()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12
 
13
+ return res
 
app/dashboard.ipynb CHANGED
@@ -2,7 +2,7 @@
2
  "cells": [
3
  {
4
  "cell_type": "code",
5
- "execution_count": 27,
6
  "metadata": {},
7
  "outputs": [
8
  {
@@ -20,7 +20,7 @@
20
  " "
21
  ],
22
  "text/plain": [
23
- "<IPython.lib.display.IFrame at 0x2a29674c0>"
24
  ]
25
  },
26
  "metadata": {},
@@ -36,9 +36,9 @@
36
  "import plotly.express as px\n",
37
  "import numpy as np\n",
38
  "from plotly.subplots import make_subplots\n",
 
39
  "\n",
40
  "df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/gapminder_unfiltered.csv')\n",
41
- "\n",
42
  "debug = False\n",
43
  "\n",
44
  "external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']\n",
@@ -53,13 +53,28 @@
53
  "server = app.server\n",
54
  "\n",
55
  "\n",
 
 
 
 
 
 
 
 
 
 
 
56
  "dashboard_layout = html.Div([\n",
57
  " dcc.Link('About this project', href='/wiki'),\n",
58
  "\n",
59
- " html.H1(children='Title of Dash App', style={'textAlign':'center'}),\n",
60
- " dcc.Dropdown(df.country.unique(), 'Canada', id='dropdown-selection'),\n",
61
- " dcc.Graph(id='graph-content')\n",
62
  "\n",
 
 
 
 
 
63
  "])\n",
64
  "\n",
65
  "\n",
@@ -74,8 +89,7 @@
74
  "\n",
75
  " html.H3('What is this project about?'),\n",
76
  "\n",
77
- " html.P('This project is a simulation of a shower system. The goal is to find the best policy for the boiler to heat the water for the shower. The policy is a function that takes the current hour of the day and the current temperature of the water in the boiler and returns the temperature that the boiler should heat the water to.'),\n",
78
- " html.P('The best policy is the one that maximizes the comfort of the shower and minimizes the energy consumption of the boiler.'),\n",
79
  "\n",
80
  " html.H3('How does it work?'),\n",
81
  "\n",
@@ -83,7 +97,7 @@
83
  "\n",
84
  " html.H3('\\'Bout us'),\n",
85
  " html.Img(src='/assets/tourdevino_logo.webp', style={'width': '40%', 'height': 'auto', 'display': 'block', 'margin-left': 'auto', 'margin-right': 'auto'}),\n",
86
- " html.P('This project was developed by a team of 3, in the context of the Aveiro Tech City 2023 hackathon.'),\n",
87
  " html.P('The team members are:'),\n",
88
  " html.H4('Rui Melo'),\n",
89
  " html.H4('André Catarino'),\n",
@@ -116,24 +130,22 @@
116
  "\n",
117
  "@app.callback(\n",
118
  " Output('graph-content', 'figure'),\n",
 
119
  " Input('dropdown-selection', 'value')\n",
120
  ")\n",
121
  "def update_graph(value):\n",
122
- " dff = df[df.country==value]\n",
123
- " return px.line(dff, x='year', y='pop')\n",
 
 
 
 
124
  "\n",
125
  "\n",
126
  "if __name__ == \"__main__\":\n",
127
  " app.run_server(host=\"0.0.0.0\", port=\"8050\", debug=debug)"
128
  ]
129
  },
130
- {
131
- "cell_type": "code",
132
- "execution_count": null,
133
- "metadata": {},
134
- "outputs": [],
135
- "source": []
136
- },
137
  {
138
  "cell_type": "code",
139
  "execution_count": null,
 
2
  "cells": [
3
  {
4
  "cell_type": "code",
5
+ "execution_count": 7,
6
  "metadata": {},
7
  "outputs": [
8
  {
 
20
  " "
21
  ],
22
  "text/plain": [
23
+ "<IPython.lib.display.IFrame at 0x2b21db970>"
24
  ]
25
  },
26
  "metadata": {},
 
36
  "import plotly.express as px\n",
37
  "import numpy as np\n",
38
  "from plotly.subplots import make_subplots\n",
39
+ "import core\n",
40
  "\n",
41
  "df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/gapminder_unfiltered.csv')\n",
 
42
  "debug = False\n",
43
  "\n",
44
  "external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']\n",
 
53
  "server = app.server\n",
54
  "\n",
55
  "\n",
56
+ "wine_similarity_df = pd.read_csv('data/wine_similarity.csv')\n",
57
+ "wine_list = wine_similarity_df['NAME'].unique()\n",
58
+ "\n",
59
+ "\n",
60
+ "\n",
61
+ "\n",
62
+ "\n",
63
+ "\n",
64
+ "\n",
65
+ "## Layout ##\n",
66
+ "\n",
67
  "dashboard_layout = html.Div([\n",
68
  " dcc.Link('About this project', href='/wiki'),\n",
69
  "\n",
70
+ " dcc.Graph(id='graph-content'),\n",
71
+ "\n",
 
72
  "\n",
73
+ "\n",
74
+ "\n",
75
+ " html.H1(children='Wine Recommender', style={'textAlign':'center'}),\n",
76
+ " dcc.Dropdown(wine_list, wine_list[0], id='dropdown-selection'),\n",
77
+ " html.Div(id='wine-recommendation', children=''),\n",
78
  "])\n",
79
  "\n",
80
  "\n",
 
89
  "\n",
90
  " html.H3('What is this project about?'),\n",
91
  "\n",
92
+ " html.P('something'),\n",
 
93
  "\n",
94
  " html.H3('How does it work?'),\n",
95
  "\n",
 
97
  "\n",
98
  " html.H3('\\'Bout us'),\n",
99
  " html.Img(src='/assets/tourdevino_logo.webp', style={'width': '40%', 'height': 'auto', 'display': 'block', 'margin-left': 'auto', 'margin-right': 'auto'}),\n",
100
+ " html.P('This project was developed by a team of 4, in the context of the SOGRAPE 2024 hackathon.'),\n",
101
  " html.P('The team members are:'),\n",
102
  " html.H4('Rui Melo'),\n",
103
  " html.H4('André Catarino'),\n",
 
130
  "\n",
131
  "@app.callback(\n",
132
  " Output('graph-content', 'figure'),\n",
133
+ " Output('wine-recommendation', 'children'),\n",
134
  " Input('dropdown-selection', 'value')\n",
135
  ")\n",
136
  "def update_graph(value):\n",
137
+ " recommended_wines = None\n",
138
+ " if value:\n",
139
+ " recommended_wines = core.get_top_5_similar_wines(value, wine_similarity_df)[1:]\n",
140
+ " recommended_wines = \"; \".join(recommended_wines)\n",
141
+ "\n",
142
+ " return px.line(df, x='year', y='pop'), recommended_wines\n",
143
  "\n",
144
  "\n",
145
  "if __name__ == \"__main__\":\n",
146
  " app.run_server(host=\"0.0.0.0\", port=\"8050\", debug=debug)"
147
  ]
148
  },
 
 
 
 
 
 
 
149
  {
150
  "cell_type": "code",
151
  "execution_count": null,
app/data/wine_similarity.csv ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ NAME,Loureiro,Alvarinho,Pedernã,Trajadura,Verdejo,Merlot, Cabernet Sauvignon, Malbec,Grenache,,Touriga Nacional,Sercialinho,"Touriga Nacional, Touriga Franca, Tinta Roriz","Tempranillo, Touriga Nacional",Malbec,Alicante Bouschet,Tempranillo, Baga, Alicante Bouschet,Cabernet Sauvignon,Sauvignon Blanc,Baga, Rufete, Touriga Franca, Tinta Barroca, Arinto de Bucelas,Albariño,Sea Food, Vegetarian, Snacks,Sea food, Fish,Beef, Lamb, Pork, Birds, Mushrooms, Blue Cheese, Pasta, Carne de Caça,Desserts, Maturated Cheese, Blue cheese, Peixes Magros, Calf, Goat Cheese,Marisco, Carne Curada,Pork, Sea Food,Quinta de Azevedo,Rueda,Vinhas de Mendoza,Douro,Dão,Alentejo,Barrancas; Tupungato;,Cachapoal Andes,Marlborough,La Rioja,Bucelas,Rías Baixas,Diogo Sepúlveda,Olga Torno,Rogelio Rabino,Luís Sottomayor,Beatriz Cabral Almeida,António Braga; Diogo Sepúlveda; Luís Cabral Almeida; Luís Sottomayor,Luís Cabral Almeida,María Barúa,Diego Vergara,Andrew Brown,Luisa Freire,Verde,Branco,Tinto,Porto Wine,Rosé,cluster
2
+ Azevedo,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,3
3
+ Gazela,1,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,7
4
+ Aura,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4
5
+ Dedicado,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,6
6
+ Legado,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,3
7
+ Offley,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0
8
+ Quinta dos Carvalhais,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,3
9
+ Série Ímpar,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,1,0,1,1,0,0,0,0,0,1,0,0,0,4
10
+ Antónia Adelaide Ferreira,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,2
11
+ Casa Ferreirinha,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,2
12
+ Finca Flichman,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1
13
+ Herdade do peso,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,8
14
+ Marqués de Burgos,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0
15
+ Porto Ferreira,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0
16
+ Sandeman,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0
17
+ Silk & Spice,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,8
18
+ Chateau Los Boldos,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,6
19
+ Framingham,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,1
20
+ LAN,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1
21
+ Mateus,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,5
22
+ Quinta da Romeira,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,2
23
+ Santiago Ruiz,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,9