Untitled
unknown
plain_text
2 years ago
5.2 kB
3
Indexable
#!/usr/bin/python # -*- coding: utf-8 -*- import dash import dash_core_components as dcc import dash_html_components as html from dash.dependencies import Input, Output import plotly.graph_objs as go from datetime import datetime import pandas as pd # задаём данные для отрисовки from sqlalchemy import create_engine # пример подключения к базе данных для Postresql # db_config = {'user': 'my_user', # 'pwd': 'my_user_password', # 'host': 'localhost', # 'port': 5432, # 'db': 'games'} # engine = create_engine('postgresql://{}:{}@{}:{}/{}'.format(db_config['user'], # db_config['pwd'], # db_config['host'], # db_config['port'], # db_config['db'])) # пример подключения к базе данных для Sqlite engine = create_engine('sqlite:////db/games.db', echo=False) # получаем сырые данные query = ''' SELECT * FROM agg_games_year_genre_platform ''' agg_games_year_genre_platform = pd.io.sql.read_sql(query, con=engine) agg_games_year_genre_platform["year_of_release"] = pd.to_datetime( agg_games_year_genre_platform["year_of_release"] ) note = ''' Этот дашборд поможет вам выучить правила композиции дашбордов. ''' external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css'] app = dash.Dash( __name__, external_stylesheets=external_stylesheets, compress=False ) app.layout = html.Div( children=[ html.H1(children='История игрового рынка'), html.Br(), html.Label(note), html.Br(), html.Label('Года выпуска:'), dcc.DatePickerRange( start_date=agg_games_year_genre_platform['year_of_release'].dt.date.min(), end_date=datetime(2016, 1, 1).strftime('%Y-%m-%d'), display_format='YYYY-MM-DD', id='dt_selector', ), html.Div( [ html.Div( [ html.Br(), html.Label('Выпуск игр по жанрам:'), dcc.Graph( style={'height': '50vw'}, id='launches_by_genre', ), ], className='six columns', ), html.Div( [ html.Br(), html.Label('Продажи по жанрам:'), dcc.Graph( style={'height': '50vw'}, id='sales_by_genre', ), ], className='six columns', ), ], className='row', ), ] ) @app.callback( [ Output('launches_by_genre', 'figure'), Output('sales_by_genre', 'figure'), ], [ Input('dt_selector', 'start_date'), Input('dt_selector', 'end_date'), ], ) def update_figures(start_date, end_date): games_by_genre = ( agg_games_year_genre_platform.groupby(['year_of_release', 'genre']) .agg({'games': 'sum'}) .reset_index() ) sales_by_genre = ( agg_games_year_genre_platform.groupby(['genre']) .agg({'total_copies_sold': 'sum'}) .reset_index() ) sales_by_genre['percent'] = ( sales_by_genre['total_copies_sold'] / sales_by_genre['total_copies_sold'].sum() ) sales_by_genre.loc[sales_by_genre['percent'] < 0.05, 'genre'] = 'Другие' sales_by_genre = ( sales_by_genre.groupby(['genre']) .agg({'total_copies_sold': 'sum'}) .reset_index() ) y_label = 'Выпущенные игры' launches_by_genre = [] for genre in games_by_genre['genre'].unique(): launches_by_genre += [ go.Scatter( x=games_by_genre.query('genre == @genre')['year_of_release'], y=games_by_genre.query('genre == @genre')['games'], mode='lines', stackgroup='one', name=genre, ) ] sales_by_genre = [ go.Pie( labels=sales_by_genre['genre'], values=sales_by_genre['total_copies_sold'], name='platfroms', ) ] return ( { 'data': launches_by_genre, 'layout': go.Layout( xaxis={'title': 'Год'}, yaxis={'title': y_label} ), }, {'data': sales_by_genre, 'layout': go.Layout()}, ) if __name__ == '__main__': app.run_server(host='0.0.0.0', port=3000)
Editor is loading...