Advertisement
Guest User

Untitled

a guest
Feb 23rd, 2020
163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.10 KB | None | 0 0
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3.  
  4. import dash
  5. import dash_core_components as dcc
  6. import dash_html_components as html
  7. from dash.dependencies import Input, Output
  8.  
  9. import plotly.graph_objs as go
  10.  
  11. from datetime import datetime
  12.  
  13. import pandas as pd
  14.  
  15. # задаём данные для отрисовки
  16. from sqlalchemy import create_engine
  17.  
  18. # пример подключения к базе данных для Postresql
  19. # db_config = {'user': 'my_user',
  20. #             'pwd': 'my_user_password',
  21. #             'host': 'localhost',
  22. #             'port': 5432,
  23. #             'db': 'games'}
  24. # engine = create_engine('postgresql://{}:{}@{}:{}/{}'.format(db_config['user'],
  25. #                                                            db_config['pwd'],
  26. #                                                            db_config['host'],
  27. #                                                            db_config['port'],
  28. #                                                            db_config['db']))
  29. # пример подключения к базе данных для Sqlite
  30. engine = create_engine('sqlite:////db/games.db', echo=False)
  31.  
  32. # получаем сырые данные
  33. query = '''
  34.            SELECT * FROM agg_games_year_genre_platform
  35.        '''
  36. agg_games_year_genre_platform = pd.io.sql.read_sql(query, con=engine)
  37. agg_games_year_genre_platform["year_of_release"] = pd.to_datetime(agg_games_year_genre_platform["year_of_release"])
  38.  
  39. note = '''
  40.          Этот дашборд поможет нам выучить правила композиции дашбордов.
  41.       '''
  42.  
  43. # задаём лейаут
  44. external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']
  45. app = dash.Dash(__name__, external_stylesheets=external_stylesheets, compress=False)
  46. app.layout = html.Div(children=[
  47.  
  48.     # формируем html
  49.     html.H1(children='История игрового рынка'),
  50.  
  51.     html.Br(),
  52.  
  53.     # пояснения
  54.     html.Label(note),
  55.  
  56.     html.Br(),
  57.  
  58.     # выбор временного периода
  59.     html.Label('Года выпуска:'),
  60.     dcc.DatePickerRange(
  61.         start_date=agg_games_year_genre_platform['year_of_release'].dt.date.min(),
  62.         end_date=datetime(2016, 1, 1).strftime('%Y-%m-%d'),
  63.         display_format='YYYY-MM-DD',
  64.         id='dt_selector',
  65.     ),
  66.  
  67.     html.Div([
  68.  
  69.         html.Div([
  70.  
  71.             # график выпуска игр по годам и жанрам
  72.             html.Label('Выпуск игр по жанрам:'),
  73.  
  74.             dcc.Graph(
  75.                 style={'height': '50vw'},
  76.                 id='launches_by_year'
  77.             ),
  78.  
  79.         ], className='twelve columns'),
  80.  
  81.     ], className='row'),
  82.  
  83. ])
  84.  
  85.  
  86. # описываем логику дашборда
  87. @app.callback(
  88.     [Output('launches_by_year', 'figure'),
  89.      ],
  90.     [Input('dt_selector', 'start_date'),
  91.      Input('dt_selector', 'end_date'),
  92.      ])
  93. def update_figures(start_date, end_date):
  94.     # для простоты игнорируем фильтрацию
  95.  
  96.     games_by_genre = (agg_games_year_genre_platform.groupby(['year_of_release', 'genre'])
  97.                       .agg({'games': 'sum'})
  98.                       .reset_index()
  99.                       )
  100.  
  101.     y_label = 'Выпущенные игры'
  102.  
  103.     # график выпуска по жанрам
  104.     data_by_genre = []
  105.     for genre in games_by_genre['genre'].unique():
  106.         data_by_genre += [go.Scatter(x=games_by_genre.query('genre == @genre')['year_of_release'],
  107.                                      y=games_by_genre.query('genre == @genre')['games'],
  108.                                      mode='lines',
  109.                                      stackgroup='one',
  110.                                      name=genre)]
  111.  
  112.     # формируем результат для отображения
  113.     return (
  114.         {
  115.             'data': data_by_genre,
  116.             'layout': go.Layout(xaxis={'title': 'Год'},
  117.                                 yaxis={'title': y_label})
  118.         },
  119.     )
  120.  
  121.  
  122. if __name__ == '__main__':
  123.     app.run_server(host='0.0.0.0', port=3000)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement