Advertisement
pasholnahuy

Untitled

Nov 5th, 2023
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.19 KB | None | 0 0
  1. import datetime
  2. def get_df_sellers(sellers, items, products, orders, translation):
  3. my_sellers = sellers[['seller_id', 'seller_state']].drop_duplicates()
  4. merged_df = my_sellers.merge(items[['order_id', 'product_id', 'seller_id']], on = 'seller_id')
  5. df = products.merge(merged_df, on = 'product_id')
  6. df = df[['seller_state', 'product_category_name', 'order_id']].merge(orders[['order_status', 'order_id', 'order_delivered_customer_date']], on = 'order_id')
  7. df = df.merge(translation, on = "product_category_name")
  8. df.drop(columns = ['product_category_name'], inplace = True)
  9. df.rename(columns = {'product_category_name_english': 'category', 'seller_state': 'state', 'order_status': 'status', 'order_delivered_customer_date' : 'date'}, inplace = True)
  10. df = df.dropna()
  11. df['date'] = pd.to_datetime(df['date']).apply(lambda x: x.strftime("%Y-%m"))
  12. df = df.groupby(['date', 'state' , 'status','category']).agg({'order_id' : 'count'}).reset_index().rename(columns = {"order_id" : "count"})
  13. return df
  14. def get_df_customers(customers, items, products, orders, translation):
  15. my_customers = customers[['customer_id', 'customer_state']].drop_duplicates()
  16. merged_df = my_customers.merge(orders, on = 'customer_id')
  17. df = items.merge(merged_df, on = 'order_id')
  18. df = df.merge(products, on = 'product_id')
  19. df = df.merge(translation, on = "product_category_name")
  20. df.drop(columns = ['product_category_name'], inplace = True)
  21. df.rename(columns = {'product_category_name_english': 'category', 'customer_state': 'state', 'order_status': 'status', 'order_delivered_customer_date' : 'date'}, inplace = True)
  22. df = df.dropna()
  23. df['date'] = pd.to_datetime(df['date']).apply(lambda x: x.strftime("%Y-%m"))
  24. df = df.groupby(['date', 'state' , 'status','category']).agg({'order_id' : 'count'}).reset_index().rename(columns = {"order_id" : "count"})
  25. return df
  26. df = get_df_sellers(sellers, items, products, orders, translation)
  27.  
  28. all_dates = df
  29. all_dates['date'] = pd.to_datetime(all_dates.date).apply(lambda x: x.date())
  30. all_dates = all_dates.sort_values(by='date')
  31.  
  32. marks = {i: str(sorted(all_dates['date'])[i]) for i in range(0, all_dates.shape[0], 7850)}
  33. all_states = ['All'] + sorted(list(set(list(sellers.seller_state.unique()) + list(customers.customer_state.unique()))))
  34. all_statuses = orders.order_status.unique()
  35. from dash import Dash, dcc, html, Input, Output
  36. app = Dash(__name__)
  37.  
  38. app.layout = html.Div([
  39. html.Label('Order statuses to display:'),
  40. dcc.Checklist(
  41. all_statuses,
  42. [df['status'][0]],
  43. id = 'status-filter'
  44. ),
  45. html.Label('State:', style={'font-size': '120%'}),
  46. html.Div(dcc.Dropdown(
  47. all_states,
  48. 'All',
  49. id = 'state-dropdown'
  50. )),
  51. dcc.Graph(id='sellers-graph'),
  52. dcc.Graph(id='customers-graph'),
  53. dcc.RangeSlider(
  54. min=0,
  55. max=all_dates.shape[0] - 1,
  56. step=1,
  57. dots=False,
  58. value=[0, all_dates.shape[0] - 1],
  59. marks = marks,
  60. id='date-slider',
  61. ),
  62. ])
  63.  
  64.  
  65.  
  66. @app.callback(
  67. Output('sellers-graph', 'figure'),
  68. [Input('date-slider', 'value'),
  69. Input('state-dropdown', 'value'),
  70. Input('status-filter', 'value')])
  71.  
  72. def update_figure(time_gap, state_to_display, statuses_filter):
  73. cur_df = get_df_sellers(sellers, items, products, orders, translation)
  74. cur_df = cur_df[cur_df['status'].isin(statuses_filter)]
  75. all_count = np.einsum('i->', cur_df['count'])
  76. cur_df['count'] = cur_df['count'] * 100/all_count
  77. if state_to_display == 'All':
  78. cur_df['state'] = 'All'
  79. else:
  80. cur_df = cur_df[cur_df.state == state_to_display]
  81. cur_df = cur_df[pd.to_datetime(sorted(all_dates['date'])[time_gap[0]]) <= pd.to_datetime(cur_df.date)]
  82. cur_df = cur_df[pd.to_datetime(cur_df.date) <= pd.to_datetime(sorted(all_dates['date'])[time_gap[1]])]
  83. fig = px.bar(cur_df, y="state", x="count", color="category",
  84. title="Distribution by sales categories", orientation='h', height=300)
  85. fig.update_layout(transition_duration=500)
  86. return fig
  87.  
  88. @app.callback(
  89. Output('customers-graph', 'figure'),
  90. [Input('date-slider', 'value'),
  91. Input('state-dropdown', 'value'),
  92. Input('status-filter', 'value')])
  93. def update_figure(time_gap, state_to_display, statuses_filter):
  94. cur_df = get_df_customers(customers, items, products, orders, translation)
  95. cur_df = cur_df[cur_df['status'].isin(statuses_filter)]
  96. all_count = np.einsum('i->', cur_df['count'])
  97. cur_df['count'] = cur_df['count'] * 100/all_count
  98. if state_to_display == 'All':
  99. cur_df['state'] = 'All'
  100. else:
  101. cur_df = cur_df[cur_df.state == state_to_display]
  102. cur_df = cur_df[pd.to_datetime(sorted(all_dates['date'])[time_gap[0]]) <= pd.to_datetime(cur_df.date)]
  103. cur_df = cur_df[pd.to_datetime(cur_df.date) <= pd.to_datetime(sorted(all_dates['date'])[time_gap[1]])]
  104. fig = px.bar(cur_df, y="state", x="count", color="category",
  105. title="Distribution by sales categories", orientation='h', height=300)
  106. fig.update_layout(transition_duration=500)
  107. return fig
  108. if __name__ == '__main__':
  109. app.run_server(debug=True)
  110.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement