Advertisement
Guest User

Untitled

a guest
Dec 14th, 2019
173
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.22 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. # Зададим параметры подключения к БД
  19. db_config = {'user': 'my_user',
  20. 'pwd': 'my_user_password',
  21. 'host': 'localhost',
  22. 'port': 5432,
  23. 'db': 'zen'}
  24.  
  25. # Формируем строку соединения с БД.
  26. engine = create_engine('postgresql://{}:{}@{}:{}/{}'.format(db_config['user'],
  27. db_config['pwd'],
  28. db_config['host'],
  29. db_config['port'],
  30. db_config['db']))
  31.  
  32. # получаем сырые данные visits
  33. query = ''' SELECT * FROM dash_visits '''
  34. dash_visits = pd.io.sql.read_sql(query, con = engine, index_col = 'record_id')
  35. dash_visits['dt'] = pd.to_datetime(dash_visits['dt']) #приводим значения dt к datetime
  36.  
  37. # получаем сырые данные engagement
  38. query = ''' SELECT * FROM dash_engagement '''
  39. dash_engagement = pd.io.sql.read_sql(query, con = engine, index_col = 'record_id')
  40. dash_engagement['dt'] = pd.to_datetime(dash_engagement['dt']) #приводим значения dt к datetime
  41.  
  42. #заголовок
  43. note = '''
  44. Дашборд показывает историю событий Яндекс.Дзен, разбивку по темам источников и глубину взаимодействия пользователей с карточками
  45. '''
  46.  
  47. # задаём лейаут
  48. external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']
  49. app = dash.Dash(__name__, external_stylesheets=external_stylesheets,compress=False)
  50. app.layout = html.Div(children =[
  51. # формируем заголовок тегом HTML
  52. html.H1('Заголовок'),
  53. html.Label(note),
  54. html.Div([
  55. html.Div([
  56.  
  57. #выбор времени
  58. html.Label('Временной период:'),
  59. dcc.DatePickerRange(
  60. start_date = dash_visits['dt'].min(),
  61. end_date = dash_visits['dt'].max(),
  62. display_format = 'YYYY-MM-DD HH:SS',
  63. id = 'dt_selector',
  64. ),
  65. ], className = 'six columns'),
  66.  
  67. # выбор темы
  68. html.Div([
  69. html.Label('Темы статей:'),
  70. dcc.Dropdown(
  71. options = [{'label': x, 'value': x} for x in dash_visits['item_topic'].unique()],
  72. value = dash_visits['item_topic'].unique().tolist(),
  73. multi = True,
  74. style = {'height': '15vw'},
  75. id = 'theme_selector'
  76. ),
  77. ], className = 'six columns'),
  78.  
  79. # выбор возрастной группы
  80. html.Div([
  81. html.Label('Возрастные группы:'),
  82. dcc.Dropdown(
  83. options = [{'label': x, 'value': x} for x in dash_visits['age_segment'].unique()],
  84. value = dash_visits['age_segment'].unique().tolist(),
  85. multi = True,
  86. id = 'age_selector'
  87. ),
  88. ], className = 'six columns'),
  89. ], className='row'),
  90. ], className='row')
  91.  
  92. html.Br(),
  93. # График количества событий по темам
  94. html.Div([
  95. html.Div([
  96. html.Label('Количество событий по темам'),
  97. dcc.Graph(
  98. style = {'height':'50vw'},
  99. id = 'history_absolute_visits'
  100. )
  101. ],className = 'six columns')
  102. ],className = 'row')
  103.  
  104. #описываем логику дашборда
  105. @app.callback(
  106. [Output('history_absolute_visits', 'figure'),
  107. ],
  108. [Input('dt_selector', 'start_date'),
  109. Input('dt_selector', 'end_date'),
  110. Input('age_selector', 'value'),
  111. Input('item_topic_selector', 'value')
  112. ])
  113.  
  114. def update_figures(start_date, end_date, age_segment, item_topic):
  115. #приводим дату к нужным типам
  116. start_date = datetime.strptime(start_date, '%Y-%m-%dT%H:%M:%S')
  117. end_date = datetime.strptime(end_date, '%Y-%m-%dT%H:%M:%S')
  118. #фильтрация
  119. filtered_visits = dash_visits.query('item_topic.isin(@item_topic) and age_segment.isin(@age_segment)\
  120. and dt >= @start_date and dt <= end_date')
  121.  
  122. grouped_by_topic = filtered_visits.groupby(['item_topic','dt']).agg({'visits':'sum'}).reset_index()
  123.  
  124. data_topic = []
  125. for topic in grouped_by_topic['item_topic'].unique():
  126. data_topic += [go.Scatter(x = grouped_by_topic.query('item_topic == @topic')['dt'],
  127. y= grouped_by_topic.query('item_topic == @topic')['visits'],
  128. mode = 'lines', stackgroup='one', name = topic)]
  129. return({'data':data_topic, 'layout':go.Layout(xaxis={'title':'date'}, yaxis={'title':'events'})})
  130.  
  131. if __name__ == '__main__':
  132. app.run_server(host='0.0.0.0', port=3000)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement