From 2923d15c1ac88f8b8a7f48b16213901fed9ce6f3 Mon Sep 17 00:00:00 2001 From: HoneyBunny <74869424+HoneyBunny0@users.noreply.github.com> Date: Sun, 8 May 2022 23:17:52 +0200 Subject: [PATCH 1/5] data analysis of wine production --- dataAnalysis.py | 139 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 dataAnalysis.py diff --git a/dataAnalysis.py b/dataAnalysis.py new file mode 100644 index 00000000..71e3c033 --- /dev/null +++ b/dataAnalysis.py @@ -0,0 +1,139 @@ +from distutils.command.clean import clean +from email.mime import application +from re import S +from statistics import mean +from sys import maxsize +from turtle import color, update +import dash +from dash import Dash, dcc, html, Input, Output +from pyparsing import col +import dash_bootstrap_components as dbc +from dash import dcc +from dash import html +import pandas as pd +import numpy as np +import plotly.graph_objs as go +import plotly.express as px + +# La donnée est téléchargeable au lien suivant : https://www.kaggle.com/datasets/zynicide/wine-reviews/download + +class WineStats(): + + def __init__(self, application = None): + wine_df = pd.concat([ + pd.read_csv('category/data/winemag-data_first150k.csv'), + pd.read_csv('category/data/winemag-data-130k-v2.csv') + ]) + + self.df = wine_df + self.app = dash.Dash(external_stylesheets = [dbc.themes.BOOTSTRAP]) + + self.figure = px.scatter_geo() + self.figure2 = self.second_graph() + + self.main_layout = html.Div(children=[ + html.H2(children="Production mondiale du vin", style={"text-align": "center"}), + html.Div([dcc.Graph(id = 'main-graph', figure=self.figure)]), + html.Div([dcc.Dropdown(['Production', 'Prix', 'Score (sur WineEnthusiastic)'], 'Production', id='dropdown')], + style={'margin': 'auto', 'width': '200px'}), + html.Div([dcc.Graph(id = 'second-graph', figure=self.figure2), ], + style={'margin': 'auto', "width": "50%"}), + html.Br(), + dcc.Markdown(""" + Les graphiques sont interactifs. En passant la souris sur les bulles vous auvez une infobulle. + Vous avez la possibilité de vous déplacer à la souris dans la carte ainsi que de zoomer et dézoomer avec + la roulette de la souris. Même chose pour le graphique. + + #### Notes : + * D'après le dataset les Etats-Unis sont les plus gros producteurs de vins. Suivi par la France et l'italie. + * En termes de continents, l'europe est le plus gros producteurs de vin dans le monde. + * La moyenne de prix la plus haute est en Suisse, suivi par la france et la Hongrie. + Ces valeurs peuvent sans doute être croisée avec le coût de la vie dans ces pays pour comprendre les chiffres. (notamment pour la suisse et la france) + * Les moyennes de score sont à mettre en question vis à vis du nombre de data dans certains pays, + cependant on remarque une tendance à avoir de meilleurs résultats dans l'ouest de l'europe. + + * On peut remarquer que aux prix les plus bas on retrouve de tout les scores. Plus le prix augmente, plus la tendance à avoir de bons scores s'accentue. + + #### À propos + Données: https://www.kaggle.com/datasets/zynicide/wine-reviews + + * (c) 2022 Paul Renoux - Paul Messéant + """) + ], style={ + 'horizontal-align': 'center' + }) + + if application: + self.app = application + else: + self.app = dash.Dash(__name__) + self.app.layout = self.main_layout + + self.app.callback( + dash.dependencies.Output('main-graph', 'figure'), + dash.dependencies.Input('dropdown', 'value') + )(self.update_graph) + + def update_graph(self, value): + count_sf = self.df['country'].value_counts() + count_df = pd.DataFrame({'pays':count_sf.index, 'nombre de bouteilles produites':count_sf.values}) + count_df = count_df.round() + + price_mean_sf = self.df[~self.df['price'].isnull()].groupby('country')['price'].mean() + price_mean_df = pd.DataFrame({'pays':price_mean_sf.index, 'moyenne des prix':price_mean_sf.values}) + price_mean_df = price_mean_df.round(2) + + score_mean_sf = self.df[~self.df['points'].isnull()].groupby('country')['points'].mean() + score_mean_df = pd.DataFrame({'pays':score_mean_sf.index, 'moyenne des scores':score_mean_sf.values}) + score_mean_df = score_mean_df.round(2) + + fig = px.scatter_geo() + + fig1 = px.scatter_geo(count_df, + locations="pays", + size="nombre de bouteilles produites", + locationmode="country names", + color="nombre de bouteilles produites" + ) + + fig2 = px.scatter_geo(price_mean_df, + locations="pays", + size="moyenne des prix", + locationmode="country names", + color="moyenne des prix" + ) + + fig3 = px.scatter_geo(score_mean_df, + locations="pays", + size="moyenne des scores", + locationmode="country names", + color="moyenne des scores", + ) + + if (value == "Production"): + fig.add_traces(fig1.data) + elif (value == "Prix"): + fig.add_traces(fig2.data) + elif (value == "Score (sur WineEnthusiastic)"): + fig.add_traces(fig3.data) + return fig + + def second_graph(self): + + clean_df = self.df[~self.df['price'].isnull()] + clean_df = clean_df[~clean_df['points'].isnull()] + + fig = px.scatter(clean_df, + x=clean_df['price'], + y=clean_df['points'], + hover_data=['designation', 'taster_name'], + title="Les scores des vins en fonction de leurs prix", + ) + return fig + + def run(self, debug=False, port=8050): + self.app.run_server(host="127.0.0.1", debug=debug, port=port) + +if __name__ == '__main__': + ws = WineStats() + ws.run(port=8055) \ No newline at end of file From 890fdf50171fb1ec3c98e4014a9ad2f4d0aef6d6 Mon Sep 17 00:00:00 2001 From: HoneyBunny <74869424+HoneyBunny0@users.noreply.github.com> Date: Sun, 8 May 2022 23:19:00 +0200 Subject: [PATCH 2/5] Update delta.py --- delta.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/delta.py b/delta.py index 5815a655..2e634442 100644 --- a/delta.py +++ b/delta.py @@ -1,9 +1,11 @@ +from importlib.resources import path import dash from dash import dcc from dash import html from energies import energies from population import population from deces import deces +from category import dataAnalysis # external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css'] @@ -12,6 +14,7 @@ pop = population.WorldPopulationStats(app) nrg = energies.Energies(app) dec = deces.Deces(app) +cat = dataAnalysis.WineStats(app) main_layout = html.Div([ html.Div(className = "row", @@ -26,6 +29,8 @@ html.Br(), dcc.Link(html.Button('Décès journaliers', style={'width':"100%"}), href='/deces'), html.Br(), + dcc.Link(html.Button('Vins dans le monde', style={'width':"100%"}), href='/category'), + html.Br(), html.Br(), html.Br(), html.Center(html.A('Code source', href='https://github.com/oricou/delta')), @@ -66,6 +71,8 @@ def display_page(pathname): return pop.main_layout elif pathname == '/deces': return dec.main_layout + elif pathname == '/category': + return cat.main_layout else: return home_page From 802221354e23751ff9f46e7fce262be7bd126ce5 Mon Sep 17 00:00:00 2001 From: HoneyBunny <74869424+HoneyBunny0@users.noreply.github.com> Date: Sun, 8 May 2022 23:20:17 +0200 Subject: [PATCH 3/5] Update README.md --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 2cf14626..468528ae 100644 --- a/README.md +++ b/README.md @@ -14,3 +14,8 @@ Ce dépôt GitHub propose des pages Jupyter et des service Dash pour analyser de Note : le choix du français est volontaire, il s'agit de promouvoir l'usage des données ouvertes auprès du grand public en France. Cela étant il est possible d'en faire une version dans une autre langue. + +### Wine production : + +Download les datas sur le lien suivant : https://www.kaggle.com/datasets/zynicide/wine-reviews/download +et mettez les dans delta/category/data From f765f177e0bd37c614cab2b6d6efba2b3f2d9aff Mon Sep 17 00:00:00 2001 From: HoneyBunny <74869424+HoneyBunny0@users.noreply.github.com> Date: Sun, 8 May 2022 23:44:50 +0200 Subject: [PATCH 4/5] Create dataAnalysis.py --- category/dataAnalysis.py | 139 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 category/dataAnalysis.py diff --git a/category/dataAnalysis.py b/category/dataAnalysis.py new file mode 100644 index 00000000..054bb809 --- /dev/null +++ b/category/dataAnalysis.py @@ -0,0 +1,139 @@ +from distutils.command.clean import clean +from email.mime import application +from re import S +from statistics import mean +from sys import maxsize +from turtle import color, update +import dash +from dash import Dash, dcc, html, Input, Output +from pyparsing import col +import dash_bootstrap_components as dbc +from dash import dcc +from dash import html +import pandas as pd +import numpy as np +import plotly.graph_objs as go +import plotly.express as px + +# La donnée est téléchargeable au lien suivant : https://www.kaggle.com/datasets/zynicide/wine-reviews/download + +class WineStats(): + + def __init__(self, application = None): + wine_df = pd.concat([ + pd.read_csv('category/data/winemag-data_first150k.csv'), + pd.read_csv('category/data/winemag-data-130k-v2.csv') + ]) + + self.df = wine_df + self.app = dash.Dash(external_stylesheets = [dbc.themes.BOOTSTRAP]) + + self.figure = px.scatter_geo() + self.figure2 = self.second_graph() + + self.main_layout = html.Div(children=[ + html.H2(children="Production mondiale du vin", style={"text-align": "center"}), + html.Div([dcc.Graph(id = 'main-graph', figure=self.figure)]), + html.Div([dcc.Dropdown(['Production', 'Prix', 'Score (sur WineEnthusiastic)'], 'Production', id='dropdown')], + style={'margin': 'auto', 'width': '200px'}), + html.Div([dcc.Graph(id = 'second-graph', figure=self.figure2), ], + style={'margin': 'auto', "width": "50%"}), + html.Br(), + dcc.Markdown(""" + Les graphiques sont interactifs. En passant la souris sur les bulles vous auvez une infobulle. + Vous avez la possibilité de vous déplacer à la souris dans la carte ainsi que de zoomer et dézoomer avec + la roulette de la souris. Même chose pour le graphique. + + #### Notes : + * D'après le dataset les Etats-Unis sont les plus gros producteurs de vins. Suivi par la France et l'italie. + * En termes de continents, l'europe est le plus gros producteurs de vin dans le monde. + * La moyenne de prix la plus haute est en Suisse, suivi par la france et la Hongrie. + Ces valeurs peuvent sans doute être croisée avec le coût de la vie dans ces pays pour comprendre les chiffres. (notamment pour la suisse et la france) + * Les moyennes de score sont à mettre en question vis à vis du nombre de data dans certains pays, + cependant on remarque une tendance à avoir de meilleurs résultats dans l'ouest de l'europe. + + * On peut remarquer que aux prix les plus bas on retrouve de tout les scores. Plus le prix augmente, plus la tendance à avoir de bons scores s'accentue. + + #### À propos + Données: https://www.kaggle.com/datasets/zynicide/wine-reviews + + * (c) 2022 Paul Renoux - Paul Messéant + """) + ], style={ + 'horizontal-align': 'center' + }) + + if application: + self.app = application + else: + self.app = dash.Dash(__name__) + self.app.layout = self.main_layout + + self.app.callback( + dash.dependencies.Output('main-graph', 'figure'), + dash.dependencies.Input('dropdown', 'value') + )(self.update_graph) + + def update_graph(self, value): + count_sf = self.df['country'].value_counts() + count_df = pd.DataFrame({'pays':count_sf.index, 'nombre de bouteilles produites':count_sf.values}) + count_df = count_df.round() + + price_mean_sf = self.df[~self.df['price'].isnull()].groupby('country')['price'].mean() + price_mean_df = pd.DataFrame({'pays':price_mean_sf.index, 'moyenne des prix':price_mean_sf.values}) + price_mean_df = price_mean_df.round(2) + + score_mean_sf = self.df[~self.df['points'].isnull()].groupby('country')['points'].mean() + score_mean_df = pd.DataFrame({'pays':score_mean_sf.index, 'moyenne des scores':score_mean_sf.values}) + score_mean_df = score_mean_df.round(2) + + fig = px.scatter_geo() + + fig1 = px.scatter_geo(count_df, + locations="pays", + size="nombre de bouteilles produites", + locationmode="country names", + color="nombre de bouteilles produites" + ) + + fig2 = px.scatter_geo(price_mean_df, + locations="pays", + size="moyenne des prix", + locationmode="country names", + color="moyenne des prix" + ) + + fig3 = px.scatter_geo(score_mean_df, + locations="pays", + size="moyenne des scores", + locationmode="country names", + color="moyenne des scores", + ) + + if (value == "Production"): + fig.add_traces(fig1.data) + elif (value == "Prix"): + fig.add_traces(fig2.data) + elif (value == "Score (sur WineEnthusiastic)"): + fig.add_traces(fig3.data) + return fig + + def second_graph(self): + + clean_df = self.df[~self.df['price'].isnull()] + clean_df = clean_df[~clean_df['points'].isnull()] + + fig = px.scatter(clean_df, + x=clean_df['price'], + y=clean_df['points'], + hover_data=['designation', 'taster_name'], + title="Les scores des vins en fonction de leurs prix", + ) + return fig + + def run(self, debug=False, port=8050): + self.app.run_server(host="127.0.0.1", debug=debug, port=port) + +if __name__ == '__main__': + ws = WineStats() + ws.run(port=8055) From 27550a70ec93902c1c95732cd65af8292292cfd1 Mon Sep 17 00:00:00 2001 From: HoneyBunny <74869424+HoneyBunny0@users.noreply.github.com> Date: Sun, 8 May 2022 23:45:43 +0200 Subject: [PATCH 5/5] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 468528ae..f4012dec 100644 --- a/README.md +++ b/README.md @@ -19,3 +19,5 @@ Note : le choix du français est volontaire, il s'agit de promouvoir l'usage Download les datas sur le lien suivant : https://www.kaggle.com/datasets/zynicide/wine-reviews/download et mettez les dans delta/category/data + +Le projet est dans le dossier category