Advertisement
mironovichandrei

Untitled

Feb 22nd, 2020
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.19 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. query = '''
  40. SELECT * FROM agg_games_year_score
  41. '''
  42. agg_games_year_score = pd.io.sql.read_sql(query, con = engine)
  43. agg_games_year_score['year_of_release'] = pd.to_datetime(agg_games_year_score['year_of_release'])
  44. # игнорируем записи без оценок
  45. agg_games_year_score = agg_games_year_score.query('avg_user_score > 0 and avg_critic_score > 0')
  46.  
  47. note = '''
  48. Этот дашборд показывает историю игрового рынка (исключая мобильные устройства).
  49. Используйте выбор интервала даты выпуска, жанра и платформы для управления дашбордом.
  50. Используйте селектор выбора режима отображения для того, чтобы показать абсолютные
  51. или относительные значения выпуска и продаж игр по годам.
  52. '''
  53.  
  54. # задаём лейаут
  55. external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']
  56. app = dash.Dash(__name__, external_stylesheets=external_stylesheets, compress=False)
  57. app.layout = html.Div(children=[
  58.  
  59. # формируем html
  60. html.H1(children = 'История игрового рынка'),
  61.  
  62. html.Br(),
  63.  
  64. html.Div([
  65. html.Div([
  66.  
  67. # график выпуска игр по годам и жанрам
  68. html.Label('Выпуск игр по жанрам:'),
  69.  
  70. dcc.RadioItems(
  71. options = [
  72. {'label': 'Абсолютные значения', 'value': 'absolute_values'},
  73. {'label': '% от общего выпуска', 'value': 'relative_values'},
  74. ],
  75. value = 'absolute_values',
  76. id = 'mode_selector'
  77. ),
  78.  
  79.  
  80. dcc.Graph(
  81. id = 'launches_by_year'
  82. ),
  83. ], className = 'eight columns'),
  84.  
  85. html.Div([
  86. # график выпуска игр по платформам
  87. html.Label('Выпуск игр по платформам:'),
  88. dcc.Graph(
  89. id = 'launches_by_platform'
  90. ),
  91. ], className = 'four columns'),
  92.  
  93. ], className = 'row'),
  94.  
  95. html.Div([
  96. html.Div([
  97.  
  98. # график выпуска игр по годам и жанрам
  99. html.Label('Продажи игр по жанрам:'),
  100.  
  101. dcc.Graph(
  102. id = 'sales_by_year'
  103. ),
  104. ], className = 'eight columns'),
  105.  
  106. html.Div([
  107. # график средних оценок по
  108. html.Label('Средние оценки по жанрам:'),
  109.  
  110. dcc.Graph(
  111. id = 'score_scatter'
  112. ),
  113. ], className = 'four columns'),
  114.  
  115. ], className = 'row'),
  116.  
  117.  
  118. # пояснения
  119. html.Label(note),
  120.  
  121. html.Br(),
  122.  
  123. html.Div([
  124.  
  125. html.Div([
  126. # выбор временного периода
  127. html.Label('Года выпуска:'),
  128. dcc.DatePickerRange(
  129. start_date = agg_games_year_genre_platform['year_of_release'].dt.date.min(),
  130. end_date = datetime(2016,1,1).strftime('%Y-%m-%d'),
  131. display_format = 'YYYY-MM-DD',
  132. id = 'dt_selector',
  133. ),
  134. ], className = 'two columns'),
  135.  
  136. html.Div([
  137. # выбор жанра
  138. html.Label('Жанры:'),
  139. dcc.Dropdown(
  140. options = [{'label': x, 'value': x} for x in agg_games_year_genre_platform['genre'].unique()],
  141. value = agg_games_year_genre_platform['genre'].unique().tolist(),
  142. multi = True,
  143. id = 'genre_selector'
  144. ),
  145. ], className = 'four columns'),
  146.  
  147. html.Div([
  148. # выбор платформы
  149. html.Label('Платформы:'),
  150. dcc.Dropdown(
  151. options = [{'label': x, 'value': x} for x in agg_games_year_genre_platform['platform'].unique()],
  152. value = agg_games_year_genre_platform['platform'].unique().tolist(),
  153. multi = True,
  154. id = 'platform_selector'
  155. ),
  156. ], className = 'six columns'),
  157.  
  158. ], className = 'row'),
  159.  
  160. ])
  161.  
  162. #описываем логику дашборда
  163. @app.callback(
  164. [Output('launches_by_year', 'figure'),
  165. Output('sales_by_year', 'figure'),
  166. Output('launches_by_platform', 'figure'),
  167. Output('score_scatter', 'figure'),
  168. ],
  169. [Input('dt_selector', 'start_date'),
  170. Input('dt_selector', 'end_date'),
  171. Input('mode_selector', 'value'),
  172. Input('genre_selector', 'value'),
  173. Input('platform_selector', 'value'),
  174. ])
  175. def update_figures(start_date, end_date, mode, selected_genres, selected_platforms):
  176.  
  177. #применяем фильтрацию
  178. filtered = agg_games_year_genre_platform.query('year_of_release >= start_date and year_of_release <= end_date')
  179. filtered = filtered.query('genre in @selected_genres')
  180. filtered = filtered.query('platform in @selected_platforms')
  181.  
  182. filtered_score = agg_games_year_score.query('year_of_release >= start_date and year_of_release <= end_date')
  183. filtered_score = filtered_score.query('genre in @selected_genres')
  184. filtered_score = filtered_score.query('platform in @selected_platforms')
  185.  
  186.  
  187. if __name__ == '__main__':
  188. app.run_server(host='0.0.0.0', port=3000)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement