Advertisement
Guest User

Untitled

a guest
Feb 26th, 2020
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.26 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. html.Div([
  69.  
  70. html.Br(),
  71.  
  72. # график выпуска игр по годам и жанрам
  73. html.Label('Выпуск игр по жанрам:'),
  74.  
  75. dcc.Graph(
  76. style = {'height': '50vw'},
  77. id = 'launches_by_year'
  78. ),
  79.  
  80. ], className = 'eight columns'),
  81.  
  82. html.Div([
  83.  
  84. html.Br(),
  85.  
  86. # график выпуска игр по платформам
  87. html.Label('Продажи платформам:'),
  88.  
  89. dcc.Graph(
  90. style = {'height': '25vw'},
  91. id = 'sales_by_platform'
  92. ),
  93.  
  94. # график выпуска игр по платформам
  95. html.Label('Продажи по жанрам:'),
  96.  
  97. dcc.Graph(
  98. style = {'height': '25vw'},
  99. id = 'sales_by_genre'
  100. ),
  101.  
  102. ], className = 'four columns'),
  103.  
  104. ], className = 'row'),
  105.  
  106. ])
  107.  
  108. # описываем логику дашборда
  109. @app.callback(
  110. [Output('launches_by_year', 'figure'),
  111. Output('sales_by_platform', 'figure'),
  112. Output('sales_by_genre', 'figure'),
  113. ],
  114. [Input('dt_selector', 'start_date'),
  115. Input('dt_selector', 'end_date'),
  116. ] )
  117. def update_figures(start_date, end_date):
  118.  
  119. # для простоты игнорируем фильтрацию
  120.  
  121. games_by_genre = (agg_games_year_genre_platform.groupby(['year_of_release', 'genre'])
  122. .agg({'games': 'sum'})
  123. .reset_index()
  124. )
  125.  
  126. sales_by_genre = (agg_games_year_genre_platform.groupby(['genre'])
  127. .agg({'total_copies_sold': 'sum'})
  128. .reset_index()
  129. )
  130. # все жанры с малым количеством игр помещаем в одну категорию
  131. sales_by_genre['percent'] = sales_by_genre['total_copies_sold'] / sales_by_genre['total_copies_sold'].sum()
  132. sales_by_genre.loc[sales_by_genre['percent'] < 0.05, 'genre'] = 'Другие'
  133. # и ещё раз группируем
  134. sales_by_genre = (sales_by_genre.groupby(['genre'])
  135. .agg({'total_copies_sold': 'sum'})
  136. .reset_index())
  137.  
  138. sales_by_platform = (agg_games_year_genre_platform.groupby(['platform'])
  139. .agg({'total_copies_sold': 'sum'})
  140. .reset_index()
  141. )
  142. # все платформы с малым количеством игр помещаем в одну категорию
  143. sales_by_platform['percent'] = sales_by_platform['total_copies_sold'] / sales_by_platform['total_copies_sold'].sum()
  144. sales_by_platform.loc[sales_by_platform['percent'] < 0.05, 'platform'] = 'Другие'
  145. # и ещё раз группируем
  146. sales_by_platform = (sales_by_platform.groupby(['platform'])
  147. .agg({'total_copies_sold': 'sum'})
  148. .reset_index())
  149.  
  150.  
  151.  
  152. y_label = 'Выпущенные игры'
  153.  
  154. # график выпуска по жанрам
  155. data_by_genre = []
  156. for genre in games_by_genre['genre'].unique():
  157. data_by_genre += [go.Scatter(x = games_by_genre.query('genre == @genre')['year_of_release'],
  158. y = games_by_genre.query('genre == @genre')['games'],
  159. mode = 'lines',
  160. stackgroup = 'one',
  161. name = genre)]
  162.  
  163. # график продаж игр по жанрам
  164. sales_by_genre = [go.Pie(labels = sales_by_genre['genre'],
  165. values = sales_by_genre['total_copies_sold'],
  166. name = 'platfroms')]
  167.  
  168. # график продаж игр по платформам
  169. sales_by_platform = [go.Pie(labels = sales_by_platform['platform'],
  170. values = sales_by_platform['total_copies_sold'],
  171. name = 'platfroms')]
  172.  
  173.  
  174.  
  175. # формируем результат для отображения
  176. return (
  177. {
  178. 'data': data_by_genre,
  179. 'layout': go.Layout(xaxis = {'title': 'Год'},
  180. yaxis = {'title': y_label})
  181. },
  182. {
  183. 'data': sales_by_genre,
  184. 'layout': go.Layout()
  185. },
  186. {
  187. 'data': sales_by_platform,
  188. 'layout': go.Layout()
  189. },
  190. )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement