Advertisement
Guest User

dashboard.py

a guest
Dec 15th, 2019
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.25 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. pd.set_option('display.max_colwidth', 0)
  19.  
  20. # Задаём параметры подключения к БД,
  21. # их можно узнать у администратора БД.
  22. db_config = {'user': 'my_user',
  23. 'pwd': 'my_user_password',
  24. 'host': 'localhost',
  25. 'port': 5432,
  26. 'db': 'zen'}
  27. # Формируем строку соединения с БД.
  28. connection_string = 'postgresql://{}:{}@{}:{}/{}'.format(db_config['user'],
  29. db_config['pwd'],
  30. db_config['host'],
  31. db_config['port'],
  32. db_config['db'])
  33. # Подключаемся к БД.
  34. engine = create_engine(connection_string)
  35.  
  36. query1 = '''SELECT *
  37. FROM dash_visits
  38. '''
  39. dash_visits = pd.io.sql.read_sql(query1, con = engine)
  40. dash_visits['dt'] = pd.to_datetime(dash_visits['dt'])
  41.  
  42. query2 = '''SELECT *
  43. FROM dash_engagement
  44. '''
  45. dash_engagement = pd.io.sql.read_sql(query2, con = engine)
  46. dash_engagement['dt'] = pd.to_datetime(dash_engagement['dt'])
  47.  
  48. note = '''
  49. Дашборд показывает историю событий Яндекс.Дзен, разбивку по темам источников и глубину взаимодействия пользователей с карточками
  50. '''
  51.  
  52. # задаём лейаут
  53. external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']
  54. app = dash.Dash(__name__, external_stylesheets=external_stylesheets,compress=False)
  55. app.layout = html.Div(children=[
  56.  
  57. # формируем html
  58. html.H1(children = 'История взаимодействия пользователей с карточками Яндекс.Дзен'),
  59. html.Br(),
  60. html.Label(note),
  61. html.Br(),
  62.  
  63. html.Div([
  64. # Выбор времени
  65. html.Div([
  66. html.Label('Фильтр даты и времени:'),
  67. dcc.DatePickerRange(
  68. start_date = dash_visits['dt'].min(),
  69. end_date = dash_visits['dt'].max(),
  70. display_format = 'YYYY-MM-DD',
  71. #style = {'height': '5vw'},
  72. id = 'dt_selector'
  73. ),
  74. ], className = 'six columns'),
  75.  
  76. # выбор Темы
  77. html.Div([
  78. html.Label('Фильтр темы карточек:'),
  79. dcc.Dropdown(
  80. options = [{'label': x, 'value': x} for x in dash_visits['item_topic'].unique()],
  81. value = dash_visits['item_topic'].unique().tolist(),
  82. multi = True,
  83. #style = {'height': '10vw'},
  84. id = 'item-topic-dropdown'
  85. ),
  86. ], className = 'six columns'),
  87. ], className = 'row'),
  88.  
  89. html.Div([
  90. # Выбор возрастной группы
  91. html.Div([
  92. html.Label('Фильтр возрастных категорий:'),
  93. dcc.Dropdown(
  94. options = [{'label': x, 'value': x} for x in dash_visits['age_segment'].unique()],
  95. value = dash_visits['age_segment'].unique().tolist(),
  96. multi = True,
  97. #style = {'height': '5vw'},
  98. id = 'age-dropdown'
  99. ),
  100. ], className = 'six columns'),
  101. ], className = 'row'),
  102. html.Br(),
  103.  
  104. html.Div([
  105. html.Div([
  106. # график количества событий по темам
  107. html.Label('График количества событий по темам:'),
  108. dcc.Graph(
  109. style = {'height':'50vw'},
  110. id = 'history-absolute-visits'
  111. ),
  112. ], className = 'six columns'),
  113.  
  114. html.Div([
  115. # график количества событий по темам
  116. html.Label('График разбивки событий по темам источников:'),
  117. dcc.Graph(
  118. style = {'height':'25vw'},
  119. id = 'pie-visits'
  120. ),
  121. ], className = 'six columns'),
  122.  
  123. html.Div([
  124. # график количества событий по темам
  125. html.Label('График средней глубины взаимодействия:'),
  126. dcc.Graph(
  127. style = {'height':'25vw'},
  128. id = 'engagement-graph'
  129. ),
  130. ], className = 'six columns')
  131.  
  132. ], className = 'row'),
  133.  
  134. ])
  135.  
  136. #описываем логику дашборда
  137.  
  138. @app.callback(
  139. [Output('history-absolute-visits', 'figure'),
  140. Output('pie-visits', 'figure'),
  141. Output('engagement-graph', 'figure'),
  142. ],
  143. [Input('dt_selector', 'start_date'),
  144. Input('dt_selector', 'end_date'),
  145. Input('age-dropdown', 'value'),
  146. Input('item-topic-dropdown', 'value'),
  147. ])
  148.  
  149. def update_figures(start_date, end_date, age_segment, item_topic):
  150. #приводим дату к нужным типам
  151. start_date = datetime.strptime(start_date, '%Y-%m-%dT%H:%M:%S')
  152. end_date = datetime.strptime(end_date, '%Y-%m-%dT%H:%M:%S')
  153.  
  154. #фильтрация
  155. filtered_visits = dash_visits.query('dt >= @start_date and dt <= end_date')
  156. filtered_visits = filtered_visits.query('age_segment in @selected_age_segment')
  157. filtered_visits = filtered_visits.query('item_topic in @selected_item_topic')
  158.  
  159. filtered_engagement = dash_engagement.query('dt >= @start_date and dt <= end_date')
  160. filtered_engagement = dash_engagement.query('age_segment in @selected_age_segment')
  161. filtered_engagement = dash_engagement.query('item_topic in @selected_item_topic')
  162.  
  163. grouped_by_item_topic = filtered_visits.groupby(['item_topic','dt']).agg({'visits':'sum'}).reset_index()
  164. grouped_by_source_topic = filtered_visits.groupby(['source_topic','dt']).agg({'visits':'sum'}).reset_index()
  165.  
  166. data_item_topic = []
  167. for topic in grouped_by_item_topic['item_topic'].unique():
  168. data_item_topic += [go.Scatter(x = grouped_by_item_topic.query('item_topic == @topic')['dt'],
  169. y= grouped_by_item_topic.query('item_topic == @topic')['visits'],
  170. mode = 'lines',
  171. stackgroup='one',
  172. name = topic)]
  173.  
  174.  
  175.  
  176.  
  177.  
  178. return(
  179. {
  180. 'data':data_item_topic,
  181. 'layout':go.Layout(xaxis={'title':'date'},
  182. yaxis={'title':'events'})
  183. },
  184.  
  185. {
  186. 'data':data_item_topic,
  187. 'layout':go.Layout(xaxis={'title':'date'},
  188. yaxis={'title':'events'})
  189. },
  190.  
  191. {
  192. 'data':data_item_topic,
  193. 'layout':go.Layout(xaxis={'title':'date'},
  194. yaxis={'title':'events'})
  195. },
  196. )
  197.  
  198.  
  199.  
  200.  
  201. print()
  202. print(dash_visits.sample(3))
  203. print()
  204. print(dash_engagement.sample(3))
  205.  
  206. print('------------------------------------------------------')
  207.  
  208.  
  209. if __name__ == "__main__":
  210. app.run_server(debug=True)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement