12311k

Untitled

Feb 16th, 2020
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.08 KB | None | 0 0
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. import dash
  4. import dash_core_components as dcc
  5. import dash_html_components as html
  6. from dash.dependencies import Input, Output
  7. import plotly.graph_objs as go
  8. from datetime import datetime
  9. import pandas as pd
  10. # задаём данные для отрисовки
  11. from sqlalchemy import create_engine
  12. # пример подключения к базе данных для Postresql
  13. #db_config = {'user': 'my_user',
  14. # 'pwd': 'my_user_password',
  15. # 'host': 'localhost',
  16. # 'port': 5432,
  17. # 'db': 'games'}
  18. #engine = create_engine('postgresql://{}:{}@{}:{}/{}'.format(db_config['user'],
  19. # db_config['pwd'],
  20. # db_config['host'],
  21. # db_config['port'],
  22. # db_config['db']))
  23. # пример подключения к базе данных для Sqlite
  24. engine = create_engine('sqlite:////db/games.db', echo = False)
  25. #получаем сырые данные
  26. query = '''
  27. SELECT * FROM data_raw
  28. '''
  29. games_raw = pd.io.sql.read_sql(query, con = engine)
  30. # преобразуем типы
  31. games_raw['year_of_release'] = pd.to_datetime(games_raw['year_of_release'])
  32. columns = ['na_players', 'eu_players', 'jp_players', 'other_players']
  33. for column in columns: games_raw[column] = pd.to_numeric(games_raw[column], errors = 'coerce')
  34. # формируем данные для отчёта
  35. games_grouped = (games_raw.groupby(['year_of_release', 'genre'])
  36. .agg({'name': 'nunique'})
  37. .reset_index()
  38. .rename(columns = {'name': 'games_launched'})
  39. )
  40. # задаём лейаут
  41. external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']
  42. app = dash.Dash(__name__, external_stylesheets=external_stylesheets,compress=False)
  43. app.layout = html.Div(children=[
  44. # формируем заголовок тегом HTML
  45. html.H1(children = 'Выпуск игр по годам'),
  46. # выбор временного периода
  47. html.Label('Временной период:'),
  48. dcc.DatePickerRange(
  49. start_date = games_grouped['year_of_release'].dt.date.min(),
  50. end_date = datetime(2016,1,1).strftime('%Y-%m-%d'),
  51. display_format = 'YYYY-MM-DD',
  52. id = 'dt_selector',
  53. ),
  54. # график выпуска игр по годам
  55. dcc.Graph(
  56. id = 'sales_by_year'
  57. ),
  58. ])
  59. # описываем логику дашборда
  60. @app.callback(
  61. [Output('sales_by_year', 'figure'),
  62. ],
  63. [Input('dt_selector', 'start_date'),
  64. Input('dt_selector', 'end_date'),
  65. ])
  66. def update_figures(start_date, end_date):
  67. # приводим входные параметры к нужным типам
  68. start_date = datetime.strptime(start_date, '%Y-%m-%d')
  69. end_date = datetime.strptime(end_date, '%Y-%m-%d')
  70. # применяем фильтрацию
  71. filtered_data = games_grouped.query('year_of_release >= @start_date and year_of_release <= @end_date')
  72. # формируем графики для отрисовки с учётом фильтров
  73. data = []
  74. for genre in filtered_data['genre'].unique():
  75. data += [go.Scatter(x = filtered_data.query('genre == @genre')['year_of_release'],
  76. y = filtered_data.query('genre == @genre')['games_launched'],
  77. mode = 'lines',
  78. stackgroup = 'one',
  79. name = genre)]
  80. # формируем результат для отображения
  81. return (
  82. {
  83. 'data': data,
  84. 'layout': go.Layout(xaxis = {'title': 'Дата и время'},
  85. yaxis = {'title': 'Выпущенные игры'})
  86. },
  87. )
  88. if __name__ == '__main__':
  89. app.run_server(host='0.0.0.0', port=3000)
Add Comment
Please, Sign In to add comment