Advertisement
Guest User

Untitled

a guest
Feb 28th, 2020
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.23 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': 'zen'}
  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/zen.db', echo=False)
  31.  
  32. # получаем сырые данные
  33. query = '''
  34. SELECT * FROM dash_visits
  35. '''
  36. dash_visits = pd.io.sql.read_sql(query, con = engine)
  37. dash_visits['dt'] = pd.to_datetime(dash_visits['dt'])
  38.  
  39. query = '''
  40. SELECT * FROM dash_engagement
  41. '''
  42. dash_engagement = pd.io.sql.read_sql(query, con = engine)
  43. dash_engagement['dt'] = pd.to_datetime(dash_engagement['dt'])
  44.  
  45. note = '''
  46. Этот дашборд отвечает на следующие вопросы: Насколько активно пользователи взаимодействуют с карточками? В каких темах сколько карточек?
  47. Какова конверсия из "увидевшего" в "прочитавшего"?
  48. '''
  49.  
  50. # задаём лейаут
  51. external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']
  52. app = dash.Dash(__name__, external_stylesheets=external_stylesheets, compress=False)
  53. app.layout = html.Div(children=[
  54.  
  55. # формируем html
  56. html.H1(children = 'Яндекс.Дзен. Пользователи и карточки'),
  57.  
  58. html.Br(),
  59. # пояснения
  60. html.Label(note),
  61.  
  62. html.Br(),
  63.  
  64. html.Div([
  65.  
  66. html.Div([
  67.  
  68. html.Div([
  69. # выбор времени
  70. html.Label('Время'),
  71. dcc.DatePickerRange(
  72. start_date = dash_visits['dt'].dt.date.min(),
  73. end_date = datetime(2019,9,25).strftime('%Y-%m-%d'),
  74. display_format = 'YYYY-MM-DD',
  75. id = 'dt_selector'),
  76. ], className = 'row container-display'),
  77.  
  78. html.Div([
  79. #выбор возрастной группы
  80. html.Label('Возрастная группа'),
  81. dcc.Dropdown(
  82. options = [{'label': x, 'value': x} for x in dash_visits['age_segment'].unique()],
  83. value = dash_visits['age_segment'].unique().tolist(),
  84. multi = True,
  85. id = 'age_selector'
  86. ),
  87. ], className = 'row container-display'
  88. ),
  89. ], className = 'six columns'
  90. ),
  91.  
  92. html.Div([
  93. #выбор темы карточки
  94. html.Label('Тема карточки'),
  95. dcc.Dropdown(
  96. options = [{'label': x, 'value': x} for x in dash_visits['item_topic'].unique()],
  97. value = dash_visits['item_topic'].unique().tolist(),
  98. multi = True,
  99. id = 'topic_selector'
  100. ),
  101. ], className = 'six columns'
  102. ),
  103.  
  104. ]),
  105.  
  106. html.Br(),
  107.  
  108. html.Div([
  109. html.Div([
  110. # график история событий по темам карточек (все типы событий, абсолютные значения)
  111. html.Label('История событий по темам карточек'),
  112. dcc.Graph(
  113. style = {'height': '50vw'},
  114. id = 'history_type_of_cards'
  115. ),
  116. ], className = 'six columns'),
  117.  
  118. html.Div([
  119. # график события по темам источников
  120. html.Label('События по темам источников'),
  121. dcc.Graph(
  122. style = {'height': '25vw'},
  123. id = 'events_by_source'
  124. ),
  125. ], className = 'six columns'),
  126.  
  127. html.Div([
  128. # график глубины взаимодействия
  129. html.Label('Глубина взаимодействия'),
  130. dcc.Graph(
  131. style = {'height': '25vw'},
  132. id = 'depth_of_engagement'
  133. ),
  134. ], className='six columns'),
  135. ])
  136. ])
  137.  
  138. #описываем логику дашборда
  139. @app.callback(
  140. [Output('history_type_of_cards', 'figure'),
  141. Output('events_by_source', 'figure'),
  142. Output('depth_of_engagement', 'figure'),
  143. ],
  144. [Input('dt_selector', 'start_date'),
  145. Input('dt_selector', 'end_date'),
  146. Input('topic_selector', 'value'),
  147. Input('age_selector', 'value'),
  148. ])
  149.  
  150. def update_figures(start_date, end_date, topic_selector, age_selector):
  151.  
  152. #применяем фильтрацию
  153. filtered = dash_visits.query('item_topic.isin(@topic_selector) and \
  154. dt >= @start_date and dt <= @end_date \
  155. and age_segment.isin(@age_selector)')
  156.  
  157. history_dash_visits = (filtered.groupby(['item_topic', 'dt'])
  158. .agg({'visits': 'sum'})
  159. .reset_index()
  160. )
  161.  
  162. events_dash_visits = (filtered.groupby(['source_topic'])
  163. .agg({'visits': 'sum'})
  164. .reset_index()
  165. )
  166.  
  167. filtered = dash_engagement.query('item_topic.isin(@topic_selector) and \
  168. dt >= @start_date and dt <= @end_date \
  169. and age_segment.isin(@age_selector)')
  170.  
  171. bottleneck_dash_engagement = (filtered.groupby(['event'])
  172. .agg({'unique_users':'sum'})
  173. .reset_index())
  174.  
  175.  
  176. # # график история событий по темам карточек (все типы событий, абсолютные значения)
  177. history = []
  178.  
  179. for genre in history_dash_visits['item_topic'].unique():
  180. history += [go.Scatter(x = history_dash_visits.query('item_topic == @topic_selector')['dt'],
  181. y = history_dash_visits.query('item_topic == @topic_selector')['item_topic'],
  182. mode = 'lines',
  183. stackgroup = 'one',
  184. name = genre)]
  185.  
  186. #формируем результат для отображения
  187. return (
  188. {
  189. 'data': history,
  190. 'layout': go.Layout(xaxis = {'title': 'Время'},
  191. yaxis = {'title': 'задай переменную'})
  192. })#,
  193.  
  194.  
  195. if __name__ == '__main__':
  196. app.run_server(debug=True)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement