customeranalytics 0.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (254) hide show
  1. customeranalytics/__init__.py +319 -0
  2. customeranalytics/configs.py +480 -0
  3. customeranalytics/data_storage_configurations/__init__.py +245 -0
  4. customeranalytics/data_storage_configurations/data_access.py +165 -0
  5. customeranalytics/data_storage_configurations/data_works_pipeline.py +207 -0
  6. customeranalytics/data_storage_configurations/es_create_index.py +544 -0
  7. customeranalytics/data_storage_configurations/logger.py +36 -0
  8. customeranalytics/data_storage_configurations/query_es.py +157 -0
  9. customeranalytics/data_storage_configurations/reports.py +684 -0
  10. customeranalytics/data_storage_configurations/schedule_data_integration.py +355 -0
  11. customeranalytics/docs/queries.yaml +245 -0
  12. customeranalytics/docs/web_configs.yaml +2 -0
  13. customeranalytics/exploratory_analysis/__init__.py +109 -0
  14. customeranalytics/exploratory_analysis/churn.py +232 -0
  15. customeranalytics/exploratory_analysis/cohorts.py +535 -0
  16. customeranalytics/exploratory_analysis/descriptive_statistics.py +470 -0
  17. customeranalytics/exploratory_analysis/funnels.py +407 -0
  18. customeranalytics/exploratory_analysis/product_analytics.py +340 -0
  19. customeranalytics/exploratory_analysis/promotion_analytics.py +299 -0
  20. customeranalytics/exploratory_analysis/rfm.py +202 -0
  21. customeranalytics/exploratory_analysis/sample_data/sample_data_avg_order_count_per_promo_per_cust.csv +99 -0
  22. customeranalytics/exploratory_analysis/sample_data/sample_data_chart_1_search.csv +2 -0
  23. customeranalytics/exploratory_analysis/sample_data/sample_data_chart_2_search.csv +46 -0
  24. customeranalytics/exploratory_analysis/sample_data/sample_data_chart_3_search.csv +2 -0
  25. customeranalytics/exploratory_analysis/sample_data/sample_data_chart_4_search.csv +2 -0
  26. customeranalytics/exploratory_analysis/sample_data/sample_data_churn.csv +2 -0
  27. customeranalytics/exploratory_analysis/sample_data/sample_data_churn_weekly.csv +10 -0
  28. customeranalytics/exploratory_analysis/sample_data/sample_data_client_feature_predicted.csv +1590 -0
  29. customeranalytics/exploratory_analysis/sample_data/sample_data_client_kpis.csv +7060 -0
  30. customeranalytics/exploratory_analysis/sample_data/sample_data_clvrfm_anomaly.csv +561 -0
  31. customeranalytics/exploratory_analysis/sample_data/sample_data_clvsegments_amount.csv +8 -0
  32. customeranalytics/exploratory_analysis/sample_data/sample_data_customer_journey.csv +18 -0
  33. customeranalytics/exploratory_analysis/sample_data/sample_data_daily_clv.csv +103 -0
  34. customeranalytics/exploratory_analysis/sample_data/sample_data_daily_cohort_downloads.csv +68 -0
  35. customeranalytics/exploratory_analysis/sample_data/sample_data_daily_cohort_from_1_to_2.csv +66 -0
  36. customeranalytics/exploratory_analysis/sample_data/sample_data_daily_cohort_from_2_to_3.csv +64 -0
  37. customeranalytics/exploratory_analysis/sample_data/sample_data_daily_cohort_from_3_to_4.csv +55 -0
  38. customeranalytics/exploratory_analysis/sample_data/sample_data_daily_dimension_values.csv +199 -0
  39. customeranalytics/exploratory_analysis/sample_data/sample_data_daily_funnel.csv +36 -0
  40. customeranalytics/exploratory_analysis/sample_data/sample_data_daily_funnel_downloads.csv +68 -0
  41. customeranalytics/exploratory_analysis/sample_data/sample_data_daily_inorganic_ratio.csv +6070 -0
  42. customeranalytics/exploratory_analysis/sample_data/sample_data_daily_orders.csv +57 -0
  43. customeranalytics/exploratory_analysis/sample_data/sample_data_daily_organic_orders.csv +64 -0
  44. customeranalytics/exploratory_analysis/sample_data/sample_data_daily_products_of_sales.csv +12574 -0
  45. customeranalytics/exploratory_analysis/sample_data/sample_data_daily_promotion_discount.csv +64 -0
  46. customeranalytics/exploratory_analysis/sample_data/sample_data_daily_promotion_revenue.csv +6070 -0
  47. customeranalytics/exploratory_analysis/sample_data/sample_data_dcohort_anomaly.csv +6 -0
  48. customeranalytics/exploratory_analysis/sample_data/sample_data_dcohort_anomaly_2.csv +118 -0
  49. customeranalytics/exploratory_analysis/sample_data/sample_data_deliver.csv +47 -0
  50. customeranalytics/exploratory_analysis/sample_data/sample_data_deliver_kpis.csv +2 -0
  51. customeranalytics/exploratory_analysis/sample_data/sample_data_deliver_weekday_hour.csv +25 -0
  52. customeranalytics/exploratory_analysis/sample_data/sample_data_dfunnel_anomaly.csv +118 -0
  53. customeranalytics/exploratory_analysis/sample_data/sample_data_dimension_kpis.csv +199 -0
  54. customeranalytics/exploratory_analysis/sample_data/sample_data_dorders_anomaly.csv +85 -0
  55. customeranalytics/exploratory_analysis/sample_data/sample_data_frequency_clusters.csv +6 -0
  56. customeranalytics/exploratory_analysis/sample_data/sample_data_frequency_recency.csv +3740 -0
  57. customeranalytics/exploratory_analysis/sample_data/sample_data_hourly_funnel.csv +25 -0
  58. customeranalytics/exploratory_analysis/sample_data/sample_data_hourly_funnel_downloads.csv +25 -0
  59. customeranalytics/exploratory_analysis/sample_data/sample_data_hourly_inorganic_ratio.csv +2353 -0
  60. customeranalytics/exploratory_analysis/sample_data/sample_data_hourly_orders.csv +25 -0
  61. customeranalytics/exploratory_analysis/sample_data/sample_data_hourly_organic_orders.csv +2353 -0
  62. customeranalytics/exploratory_analysis/sample_data/sample_data_inorganic_orders_per_promotion_per_day.csv +6070 -0
  63. customeranalytics/exploratory_analysis/sample_data/sample_data_kpis.csv +2 -0
  64. customeranalytics/exploratory_analysis/sample_data/sample_data_monetary_clusters.csv +6 -0
  65. customeranalytics/exploratory_analysis/sample_data/sample_data_monetary_frequency.csv +3740 -0
  66. customeranalytics/exploratory_analysis/sample_data/sample_data_monthly_funnel.csv +5 -0
  67. customeranalytics/exploratory_analysis/sample_data/sample_data_monthly_funnel_downloads.csv +5 -0
  68. customeranalytics/exploratory_analysis/sample_data/sample_data_monthly_orders.csv +4 -0
  69. customeranalytics/exploratory_analysis/sample_data/sample_data_most_combined_products.csv +11 -0
  70. customeranalytics/exploratory_analysis/sample_data/sample_data_most_ordered_categories.csv +11 -0
  71. customeranalytics/exploratory_analysis/sample_data/sample_data_most_ordered_products.csv +11 -0
  72. customeranalytics/exploratory_analysis/sample_data/sample_data_order_and_payment_amount_differences.csv +91 -0
  73. customeranalytics/exploratory_analysis/sample_data/sample_data_prepare.csv +101 -0
  74. customeranalytics/exploratory_analysis/sample_data/sample_data_prepare_weekday_hour.csv +25 -0
  75. customeranalytics/exploratory_analysis/sample_data/sample_data_product_kpis.csv +201 -0
  76. customeranalytics/exploratory_analysis/sample_data/sample_data_product_usage_before_after_amount_accept.csv +11 -0
  77. customeranalytics/exploratory_analysis/sample_data/sample_data_product_usage_before_after_amount_reject.csv +7 -0
  78. customeranalytics/exploratory_analysis/sample_data/sample_data_product_usage_before_after_orders_accept.csv +11 -0
  79. customeranalytics/exploratory_analysis/sample_data/sample_data_product_usage_before_after_orders_reject.csv +11 -0
  80. customeranalytics/exploratory_analysis/sample_data/sample_data_promotion_comparison.csv +91 -0
  81. customeranalytics/exploratory_analysis/sample_data/sample_data_promotion_kpis.csv +99 -0
  82. customeranalytics/exploratory_analysis/sample_data/sample_data_promotion_number_of_customer.csv +99 -0
  83. customeranalytics/exploratory_analysis/sample_data/sample_data_promotion_usage_before_after_amount_accept.csv +81 -0
  84. customeranalytics/exploratory_analysis/sample_data/sample_data_promotion_usage_before_after_amount_reject.csv +11 -0
  85. customeranalytics/exploratory_analysis/sample_data/sample_data_promotion_usage_before_after_orders_accept.csv +55 -0
  86. customeranalytics/exploratory_analysis/sample_data/sample_data_promotion_usage_before_after_orders_reject.csv +37 -0
  87. customeranalytics/exploratory_analysis/sample_data/sample_data_purchase_amount_distribution.csv +22 -0
  88. customeranalytics/exploratory_analysis/sample_data/sample_data_recency_clusters.csv +6 -0
  89. customeranalytics/exploratory_analysis/sample_data/sample_data_recency_monetary.csv +3740 -0
  90. customeranalytics/exploratory_analysis/sample_data/sample_data_rfm.csv +2001 -0
  91. customeranalytics/exploratory_analysis/sample_data/sample_data_ride.csv +101 -0
  92. customeranalytics/exploratory_analysis/sample_data/sample_data_ride_weekday_hour.csv +25 -0
  93. customeranalytics/exploratory_analysis/sample_data/sample_data_segmentation.csv +11 -0
  94. customeranalytics/exploratory_analysis/sample_data/sample_data_segments_change_daily_before_after_amount.csv +10 -0
  95. customeranalytics/exploratory_analysis/sample_data/sample_data_segments_change_daily_before_after_orders.csv +9 -0
  96. customeranalytics/exploratory_analysis/sample_data/sample_data_segments_change_monthly_before_after_amount.csv +10 -0
  97. customeranalytics/exploratory_analysis/sample_data/sample_data_segments_change_monthly_before_after_orders.csv +11 -0
  98. customeranalytics/exploratory_analysis/sample_data/sample_data_segments_change_weekly_before_after_amount.csv +10 -0
  99. customeranalytics/exploratory_analysis/sample_data/sample_data_segments_change_weekly_before_after_orders.csv +10 -0
  100. customeranalytics/exploratory_analysis/sample_data/sample_data_user_counts_per_order_seq.csv +47 -0
  101. customeranalytics/exploratory_analysis/sample_data/sample_data_weekly_average_order_per_user.csv +13 -0
  102. customeranalytics/exploratory_analysis/sample_data/sample_data_weekly_average_payment_amount.csv +13 -0
  103. customeranalytics/exploratory_analysis/sample_data/sample_data_weekly_average_session_per_user.csv +13 -0
  104. customeranalytics/exploratory_analysis/sample_data/sample_data_weekly_cohort_downloads.csv +13 -0
  105. customeranalytics/exploratory_analysis/sample_data/sample_data_weekly_cohort_from_1_to_2.csv +13 -0
  106. customeranalytics/exploratory_analysis/sample_data/sample_data_weekly_cohort_from_2_to_3.csv +13 -0
  107. customeranalytics/exploratory_analysis/sample_data/sample_data_weekly_cohort_from_3_to_4.csv +12 -0
  108. customeranalytics/exploratory_analysis/sample_data/sample_data_weekly_funnel.csv +25 -0
  109. customeranalytics/exploratory_analysis/sample_data/sample_data_weekly_funnel_downloads.csv +25 -0
  110. customeranalytics/exploratory_analysis/sample_data/sample_data_weekly_orders.csv +10 -0
  111. customeranalytics/ml_process/__init__.py +64 -0
  112. customeranalytics/ml_process/ab_test.py +615 -0
  113. customeranalytics/ml_process/anomaly_detection.py +456 -0
  114. customeranalytics/ml_process/clv_prediction.py +301 -0
  115. customeranalytics/ml_process/customer_segmentation.py +354 -0
  116. customeranalytics/ml_process/delivery_analytics.py +754 -0
  117. customeranalytics/utils.py +186 -0
  118. customeranalytics/web/app/__init__.py +37 -0
  119. customeranalytics/web/app/base/__init__.py +9 -0
  120. customeranalytics/web/app/base/forms.py +16 -0
  121. customeranalytics/web/app/base/models.py +43 -0
  122. customeranalytics/web/app/base/routes.py +126 -0
  123. customeranalytics/web/app/base/static/assets/css/app.css +20 -0
  124. customeranalytics/web/app/base/static/assets/fonts/Inter-Black.woff +0 -0
  125. customeranalytics/web/app/base/static/assets/fonts/Inter-Black.woff2 +0 -0
  126. customeranalytics/web/app/base/static/assets/fonts/Inter-BlackItalic.woff +0 -0
  127. customeranalytics/web/app/base/static/assets/fonts/Inter-BlackItalic.woff2 +0 -0
  128. customeranalytics/web/app/base/static/assets/fonts/Inter-Bold.woff +0 -0
  129. customeranalytics/web/app/base/static/assets/fonts/Inter-Bold.woff2 +0 -0
  130. customeranalytics/web/app/base/static/assets/fonts/Inter-BoldItalic.woff +0 -0
  131. customeranalytics/web/app/base/static/assets/fonts/Inter-BoldItalic.woff2 +0 -0
  132. customeranalytics/web/app/base/static/assets/fonts/Inter-ExtraBold.woff +0 -0
  133. customeranalytics/web/app/base/static/assets/fonts/Inter-ExtraBold.woff2 +0 -0
  134. customeranalytics/web/app/base/static/assets/fonts/Inter-ExtraBoldItalic.woff +0 -0
  135. customeranalytics/web/app/base/static/assets/fonts/Inter-ExtraBoldItalic.woff2 +0 -0
  136. customeranalytics/web/app/base/static/assets/fonts/Inter-ExtraLight-BETA.woff +0 -0
  137. customeranalytics/web/app/base/static/assets/fonts/Inter-ExtraLight-BETA.woff2 +0 -0
  138. customeranalytics/web/app/base/static/assets/fonts/Inter-ExtraLightItalic-BETA.woff +0 -0
  139. customeranalytics/web/app/base/static/assets/fonts/Inter-ExtraLightItalic-BETA.woff2 +0 -0
  140. customeranalytics/web/app/base/static/assets/fonts/Inter-Italic.woff +0 -0
  141. customeranalytics/web/app/base/static/assets/fonts/Inter-Italic.woff2 +0 -0
  142. customeranalytics/web/app/base/static/assets/fonts/Inter-Light-BETA.woff +0 -0
  143. customeranalytics/web/app/base/static/assets/fonts/Inter-Light-BETA.woff2 +0 -0
  144. customeranalytics/web/app/base/static/assets/fonts/Inter-LightItalic-BETA.woff +0 -0
  145. customeranalytics/web/app/base/static/assets/fonts/Inter-LightItalic-BETA.woff2 +0 -0
  146. customeranalytics/web/app/base/static/assets/fonts/Inter-Medium.woff +0 -0
  147. customeranalytics/web/app/base/static/assets/fonts/Inter-Medium.woff2 +0 -0
  148. customeranalytics/web/app/base/static/assets/fonts/Inter-MediumItalic.woff +0 -0
  149. customeranalytics/web/app/base/static/assets/fonts/Inter-MediumItalic.woff2 +0 -0
  150. customeranalytics/web/app/base/static/assets/fonts/Inter-Regular.woff +0 -0
  151. customeranalytics/web/app/base/static/assets/fonts/Inter-Regular.woff2 +0 -0
  152. customeranalytics/web/app/base/static/assets/fonts/Inter-SemiBold.woff +0 -0
  153. customeranalytics/web/app/base/static/assets/fonts/Inter-SemiBold.woff2 +0 -0
  154. customeranalytics/web/app/base/static/assets/fonts/Inter-SemiBoldItalic.woff +0 -0
  155. customeranalytics/web/app/base/static/assets/fonts/Inter-SemiBoldItalic.woff2 +0 -0
  156. customeranalytics/web/app/base/static/assets/fonts/Inter-Thin-BETA.woff +0 -0
  157. customeranalytics/web/app/base/static/assets/fonts/Inter-Thin-BETA.woff2 +0 -0
  158. customeranalytics/web/app/base/static/assets/fonts/Inter-ThinItalic-BETA.woff +0 -0
  159. customeranalytics/web/app/base/static/assets/fonts/Inter-ThinItalic-BETA.woff2 +0 -0
  160. customeranalytics/web/app/base/static/assets/fonts/Inter-italic.var.woff2 +0 -0
  161. customeranalytics/web/app/base/static/assets/fonts/Inter-upright.var.woff2 +0 -0
  162. customeranalytics/web/app/base/static/assets/fonts/Inter.var.woff2 +0 -0
  163. customeranalytics/web/app/base/static/assets/fonts/fa-brands-400.eot +0 -0
  164. customeranalytics/web/app/base/static/assets/fonts/fa-brands-400.svg +3570 -0
  165. customeranalytics/web/app/base/static/assets/fonts/fa-brands-400.ttf +0 -0
  166. customeranalytics/web/app/base/static/assets/fonts/fa-brands-400.woff +0 -0
  167. customeranalytics/web/app/base/static/assets/fonts/fa-brands-400.woff2 +0 -0
  168. customeranalytics/web/app/base/static/assets/fonts/fa-regular-400.eot +0 -0
  169. customeranalytics/web/app/base/static/assets/fonts/fa-regular-400.svg +801 -0
  170. customeranalytics/web/app/base/static/assets/fonts/fa-regular-400.ttf +0 -0
  171. customeranalytics/web/app/base/static/assets/fonts/fa-regular-400.woff +0 -0
  172. customeranalytics/web/app/base/static/assets/fonts/fa-regular-400.woff2 +0 -0
  173. customeranalytics/web/app/base/static/assets/fonts/fa-solid-900.eot +0 -0
  174. customeranalytics/web/app/base/static/assets/fonts/fa-solid-900.svg +5028 -0
  175. customeranalytics/web/app/base/static/assets/fonts/fa-solid-900.ttf +0 -0
  176. customeranalytics/web/app/base/static/assets/fonts/fa-solid-900.woff +0 -0
  177. customeranalytics/web/app/base/static/assets/fonts/fa-solid-900.woff2 +0 -0
  178. customeranalytics/web/app/base/static/assets/img/avatars/avatar-1.png +0 -0
  179. customeranalytics/web/app/base/static/assets/img/avatars/avatar-2.png +0 -0
  180. customeranalytics/web/app/base/static/assets/img/avatars/avatar-3.png +0 -0
  181. customeranalytics/web/app/base/static/assets/img/avatars/avatar-4.png +0 -0
  182. customeranalytics/web/app/base/static/assets/img/avatars/avatar-5.png +0 -0
  183. customeranalytics/web/app/base/static/assets/img/avatars/info.jpeg +0 -0
  184. customeranalytics/web/app/base/static/assets/img/icons/customanality.png +0 -0
  185. customeranalytics/web/app/base/static/assets/img/icons/icon-48x48.png +0 -0
  186. customeranalytics/web/app/base/static/assets/js/app.js +2 -0
  187. customeranalytics/web/app/base/static/assets/js/app.js.LICENSE +566 -0
  188. customeranalytics/web/app/base/static/assets/js/app.js.LICENSE.txt +556 -0
  189. customeranalytics/web/app/base/static/assets/js/modules/bootstrap.js +15 -0
  190. customeranalytics/web/app/base/static/assets/js/modules/chartjs.js +4 -0
  191. customeranalytics/web/app/base/static/assets/js/modules/feather.js +8 -0
  192. customeranalytics/web/app/base/static/assets/js/modules/flatpickr.js +4 -0
  193. customeranalytics/web/app/base/static/assets/js/modules/moment.js +4 -0
  194. customeranalytics/web/app/base/static/assets/js/modules/sidebar.js +23 -0
  195. customeranalytics/web/app/base/static/assets/js/modules/theme.js +16 -0
  196. customeranalytics/web/app/base/templates/accounts/login.html +81 -0
  197. customeranalytics/web/app/base/templates/accounts/register.html +80 -0
  198. customeranalytics/web/app/base/templates/includes/footer.html +28 -0
  199. customeranalytics/web/app/base/templates/includes/navigation.html +51 -0
  200. customeranalytics/web/app/base/templates/includes/scripts.html +3 -0
  201. customeranalytics/web/app/base/templates/includes/sidebar.html +146 -0
  202. customeranalytics/web/app/base/templates/layouts/base-fullscreen.html +36 -0
  203. customeranalytics/web/app/base/templates/layouts/base.html +84 -0
  204. customeranalytics/web/app/base/util.py +30 -0
  205. customeranalytics/web/app/home/__init__.py +9 -0
  206. customeranalytics/web/app/home/forms.py +1039 -0
  207. customeranalytics/web/app/home/models.py +438 -0
  208. customeranalytics/web/app/home/profiles.py +310 -0
  209. customeranalytics/web/app/home/routes.py +386 -0
  210. customeranalytics/web/app/home/search.py +288 -0
  211. customeranalytics/web/app/home/static/assets/img/avatars/avatar-1.png +0 -0
  212. customeranalytics/web/app/home/static/assets/img/avatars/avatar-2.png +0 -0
  213. customeranalytics/web/app/home/static/assets/img/avatars/avatar-3.png +0 -0
  214. customeranalytics/web/app/home/static/assets/img/avatars/avatar-4.png +0 -0
  215. customeranalytics/web/app/home/static/assets/img/avatars/avatar-5.png +0 -0
  216. customeranalytics/web/app/home/static/assets/img/icons/customanality.png +0 -0
  217. customeranalytics/web/app/home/static/assets/img/icons/icon-48x48.png +0 -0
  218. customeranalytics/web/app/home/templates/abtest-product.html +280 -0
  219. customeranalytics/web/app/home/templates/abtest-promotion.html +362 -0
  220. customeranalytics/web/app/home/templates/abtest-segments.html +298 -0
  221. customeranalytics/web/app/home/templates/add-data-delivery.html +184 -0
  222. customeranalytics/web/app/home/templates/add-data-product.html +177 -0
  223. customeranalytics/web/app/home/templates/add-data-purchase.html +392 -0
  224. customeranalytics/web/app/home/templates/anomaly.html +261 -0
  225. customeranalytics/web/app/home/templates/clv.html +211 -0
  226. customeranalytics/web/app/home/templates/cohorts.html +308 -0
  227. customeranalytics/web/app/home/templates/customer-segmentation.html +308 -0
  228. customeranalytics/web/app/home/templates/data-es.html +152 -0
  229. customeranalytics/web/app/home/templates/data-execute.html +397 -0
  230. customeranalytics/web/app/home/templates/delivery.html +404 -0
  231. customeranalytics/web/app/home/templates/funnel-customer.html +240 -0
  232. customeranalytics/web/app/home/templates/funnel-session.html +236 -0
  233. customeranalytics/web/app/home/templates/index.html +524 -0
  234. customeranalytics/web/app/home/templates/index2.html +515 -0
  235. customeranalytics/web/app/home/templates/page-403.html +46 -0
  236. customeranalytics/web/app/home/templates/page-404.html +45 -0
  237. customeranalytics/web/app/home/templates/page-500.html +45 -0
  238. customeranalytics/web/app/home/templates/pages-blank.html +33 -0
  239. customeranalytics/web/app/home/templates/pages-sign-in.html +67 -0
  240. customeranalytics/web/app/home/templates/pages-sign-up.html +61 -0
  241. customeranalytics/web/app/home/templates/product.html +203 -0
  242. customeranalytics/web/app/home/templates/profile.html +1009 -0
  243. customeranalytics/web/app/home/templates/rfm.html +254 -0
  244. customeranalytics/web/app/home/templates/search.html +167 -0
  245. customeranalytics/web/app/home/templates/settings.html +205 -0
  246. customeranalytics/web/app/home/templates/stats-desc.html +230 -0
  247. customeranalytics/web/app/home/templates/stats-purchase.html +221 -0
  248. customeranalytics/web/config.py +30 -0
  249. customeranalytics/web/db.sqlite3 +0 -0
  250. customeranalytics/web/run.py +30 -0
  251. customeranalytics-0.1.dist-info/METADATA +1102 -0
  252. customeranalytics-0.1.dist-info/RECORD +254 -0
  253. customeranalytics-0.1.dist-info/WHEEL +4 -0
  254. customeranalytics-0.1.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,310 @@
1
+ import sys, os, inspect
2
+ currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
3
+ parentdir = os.path.dirname(currentdir)
4
+ sys.path.insert(0, parentdir)
5
+
6
+ import pandas as pd
7
+ from numpy import array
8
+ import json
9
+ import datetime
10
+
11
+ from os.path import join, dirname, exists
12
+ from flask_login import current_user
13
+ from os import listdir
14
+ import plotly.graph_objs as go
15
+ import plotly
16
+ from screeninfo import get_monitors
17
+ from sqlalchemy import create_engine, MetaData
18
+ from werkzeug.utils import secure_filename
19
+
20
+ from customeranalytics.utils import abspath_for_sample_data, read_yaml, current_date_to_day, convert_to_date
21
+ from customeranalytics.configs import query_path, chart_names, ALLOWED_IMAGE_EXTENSIONS, MAX_IMAGE_FILESIZE, TIME_DIFF_STR, DATE_DIFF_STR
22
+ from .forms import SampleData, RealData, Charts, charts
23
+
24
+ engine = create_engine('sqlite://///' + join(abspath_for_sample_data(), "web", 'db.sqlite3'),
25
+ connect_args={'check_same_thread': False})
26
+ metadata = MetaData()
27
+ con = engine.connect()
28
+
29
+ samples = SampleData()
30
+ real = RealData()
31
+ charts = Charts(samples.kpis, real)
32
+
33
+
34
+ def image_format(filename):
35
+ return filename.rsplit(".", 1)[1]
36
+
37
+
38
+ def allowed_image(filename):
39
+
40
+ if not "." in filename:
41
+ return False
42
+
43
+ ext = image_format(filename)
44
+
45
+ if ext.upper() in ALLOWED_IMAGE_EXTENSIONS:
46
+ return True
47
+ else:
48
+ return False
49
+
50
+
51
+ def allowed_image_filesize(request):
52
+ if "filesize" in request.cookies:
53
+ if int(request.cookies['filesize']) <= MAX_IMAGE_FILESIZE:
54
+ return True
55
+ else:
56
+ return False
57
+ else:
58
+ return True
59
+
60
+
61
+ class Profiles:
62
+ def __init__(self, user=None):
63
+ self.user = user
64
+ self.users = []
65
+ self.sqlite_queries = read_yaml(query_path, "queries.yaml")
66
+ self.tables = pd.read_sql(self.sqlite_queries['tables'], con)
67
+ self.data_types = {'orders': 'Sessions', 'downloads': 'Customers', 'products': 'Products (Baskets)'}
68
+ self.log_file = []
69
+ self.recent_chats = pd.DataFrame()
70
+ self.filters = ['main']
71
+ self.message_sep = "#*#*£½"
72
+ self.message_key_sep = "_1_1_1_"
73
+ self.message_key_val_sep = ":1:1:1:"
74
+
75
+ def insert_query(self, table, columns, values):
76
+ values = [values[col] for col in columns]
77
+ _query = "INSERT INTO " + table + " "
78
+ _query += " (" + ", ".join(columns) + ") "
79
+ _query += " VALUES (" + ", ".join([" '{}' ".format(v) for v in values]) + ") "
80
+ _query = _query.replace("\\", "")
81
+ return _query
82
+
83
+ def update_query(self, table, condition, columns, values):
84
+ values = [(col, values[col]) for col in columns if values.get(col, None) is not None]
85
+ _query = "UPDATE " + table
86
+ _query += " SET " + ", ".join([i[0] + " = '" + i[1] + "'" for i in values])
87
+ _query +=" WHERE " + condition
88
+ _query = _query.replace("\\", "")
89
+ return _query
90
+
91
+ def delete_query(self, table, condition):
92
+ _query = "DELETE FROM " + table
93
+ _query += " WHERE " + condition
94
+ _query = _query.replace("\\", "")
95
+ return _query
96
+
97
+ def check_for_table_exits(self, table):
98
+ """
99
+ checking sqlite if table is created before. If it not, table is created.
100
+ :params table: checking table name in sqlite
101
+ """
102
+ if table not in list(self.tables['name']):
103
+ con.execute(self.sqlite_queries[table])
104
+
105
+ def read_chats(self):
106
+ try:
107
+ return pd.read_sql("""
108
+ SELECT chat.*, user_avatar.user_avatar
109
+ FROM chat LEFT JOIN (SELECT user, user_avatar FROM user_avatar) AS user_avatar
110
+ ON chat.user = user_avatar.user
111
+ """, con)
112
+ except Exception as e:
113
+ return pd.DataFrame()
114
+
115
+ def check_sub_chats(self, messages):
116
+ updated_messages = ""
117
+ if messages != "":
118
+ updated_messages = []
119
+ for m in messages.split(self.message_sep):
120
+ d = {k.split(self.message_key_val_sep)[0]: k.split(self.message_key_val_sep)[1] for k in
121
+ m.split(self.message_key_sep)}
122
+ d['date_1'] = self.get_time_diff_string(convert_to_date(d['date']))
123
+ d['date_2'] = self.get_date_diff_string(convert_to_date(d['date']))
124
+ d['user_avatar'] = self.fetch_pic(user=d['user'])
125
+ updated_messages.append(d)
126
+ return updated_messages
127
+
128
+ def find_user(self):
129
+ try:
130
+ user = current_user.username
131
+ except Exception as e:
132
+ user = "_"
133
+ return user
134
+
135
+ def get_plots(self, plots):
136
+ charts_for_profile = {}
137
+ _updated_chart_names = []
138
+ for plot in plots:
139
+ _chart_name = None
140
+ if plot != '':
141
+ _target, _chart, _index, _date = plot.split("*")
142
+ graph_json = charts.get_individual_chart(target=_target, chart=_chart, index=_index, date=_date if _date != '' else None)
143
+ charts_for_profile[_chart] = charts.get_json_format(graph_json)
144
+ _chart_name = _chart
145
+ _updated_chart_names.append(_chart_name)
146
+ for page in chart_names:
147
+ for i in chart_names[page]:
148
+ _chart_name = chart_names[page][i].split("*")[-1]
149
+ if _chart_name not in list(charts_for_profile.keys()):
150
+ charts_for_profile[chart_names[page][i].split("*")[-1]] = {'trace': [], 'layout': []}
151
+ return charts_for_profile, _updated_chart_names
152
+
153
+ def get_time_diff_string(self, date):
154
+ _total_sec = abs(date - current_date_to_day()).total_seconds()
155
+ counter = 0
156
+ detected = False
157
+ _format = ("%b %d %H:%M ", "%p") if _total_sec < (60 * 60 * 24 * 365) else ("'%y %b %d %H:%M ", "%p")
158
+ time_diff_str = ""
159
+ default_condition = lambda x: True if x >= len(TIME_DIFF_STR) - 1 else False
160
+ condition = lambda x: True if TIME_DIFF_STR[x][0] <= _total_sec < TIME_DIFF_STR[x + 1][0] else False
161
+ while not detected:
162
+ if condition(counter) or default_condition(counter):
163
+ value = ""
164
+ try:
165
+ value = str(int(_total_sec / TIME_DIFF_STR[counter][0]))
166
+ except Exception as e:
167
+ print(e)
168
+ time_diff_str = value + TIME_DIFF_STR[counter + 1][1]
169
+ detected = True
170
+ counter += 1
171
+ return time_diff_str
172
+
173
+ def get_date_diff_string(self, date):
174
+ _total_sec = abs(date - current_date_to_day()).total_seconds()
175
+ _format = ("%b %d %H:%M ", "%p") if _total_sec < (60 * 60 * 24 * 365) else ("'%y %b %d %H:%M ", "%p")
176
+ date_str, prefix_date_str = [""]*2
177
+
178
+ for p_d_str in range(2):
179
+ if DATE_DIFF_STR[p_d_str][0] < _total_sec < DATE_DIFF_STR[p_d_str + 1][0]:
180
+ prefix_date_str = DATE_DIFF_STR[p_d_str + 1][1]
181
+ if prefix_date_str in [DATE_DIFF_STR[0][1], DATE_DIFF_STR[1][1]]:
182
+ date_str = DATE_DIFF_STR[0][1] + " " + date.strftime("%b %d %H:%M ") + date.strftime("%p").lower()
183
+ datetime.datetime.now().strftime("%b %d %H:%M ") + datetime.datetime.now().strftime("%p").lower()
184
+ else:
185
+ date_str = date.strftime(_format[0]) + date.strftime(_format[1]).lower()
186
+ return date_str
187
+
188
+ def fetch_chats(self):
189
+ recent_chats = self.read_chats()
190
+ charts_for_profiles = {}
191
+ if len(recent_chats) != 0:
192
+ recent_chats['message'] = recent_chats['message'].apply(lambda x: self.check_sub_chats(x))
193
+ recent_chats['date'] = recent_chats['date'].apply(lambda x: convert_to_date(x))
194
+ recent_chats = recent_chats.sort_values('date', ascending=False)
195
+ recent_chats['date_1'] = recent_chats['date'].apply(lambda x: self.get_time_diff_string(x))
196
+ recent_chats['date_2'] = recent_chats['date'].apply(lambda x: self.get_date_diff_string(x))
197
+ charts_for_profiles, recent_chats['chart_name'] = self.get_plots(list(recent_chats['chart']))
198
+ self.filters = {"dimensions": real.get_report_dimensions(), "chart_names": chart_names}
199
+ return {"messages": recent_chats.to_dict('records') if len(recent_chats) != 0 else None,
200
+ 'charts': charts_for_profiles, 'filters': self.filters}
201
+
202
+ def fetch_pic(self, user=None):
203
+ _user_name = current_user.username
204
+ logo = "info.pic"
205
+ if user is not None:
206
+ _user_name = user
207
+ try:
208
+ logo = list(pd.read_sql("""
209
+ SELECT user_avatar
210
+ FROM user_avatar
211
+ WHERE user = '{}'
212
+ """.format(_user_name), con)['user_avatar'])[0]
213
+ except Exception as e:
214
+ print(e)
215
+ logo = "info.jpeg"
216
+ return logo
217
+
218
+ def add_pic(self, request):
219
+ """
220
+
221
+ """
222
+
223
+ try:
224
+ image = request.files["image"]
225
+ filename = secure_filename(image.filename)
226
+ if allowed_image(filename) and allowed_image_filesize(request):
227
+ updated_filename = ".".join([current_user.username, image_format(filename)])
228
+ path = os.path.join(abspath_for_sample_data(),
229
+ "web", "app", "base", "static", "assets", "img", "avatars", updated_filename)
230
+ image.save(path)
231
+
232
+ try:
233
+ self.check_for_table_exits('user_avatar')
234
+ except Exception as e:
235
+ print()
236
+
237
+ try:
238
+ con.execute(self.delete_query(table='user_avatar',
239
+ condition=" user = '" + current_user.username + "' "))
240
+ except Exception as e:
241
+ print()
242
+ try:
243
+ con.execute(self.insert_query(table='user_avatar',
244
+ columns=self.sqlite_queries['columns']['user_avatar'][1:],
245
+ values={'user': current_user.username,
246
+ "user_avatar": updated_filename}
247
+ ))
248
+ except Exception as e:
249
+ print()
250
+
251
+ except Exception as e:
252
+ print("no files uploaded")
253
+
254
+ def add_new_message(self, request):
255
+ """
256
+
257
+ """
258
+ if request != {}:
259
+ _user = self.find_user()
260
+ _user_logo = self.fetch_pic()
261
+ try:
262
+ _chart_name = chart_names[request['chart'].split("*")[0]][request['chart'].split("*")[1]]
263
+ _index = request['index']
264
+ _date = '' if request['date'] == '' else request['date']
265
+ _chart = _chart_name + "*" + _index + "*" + _date
266
+ except Exception as e:
267
+ _chart = ""
268
+
269
+ try:
270
+ self.check_for_table_exits("chat")
271
+ except Exception as e:
272
+ print()
273
+
274
+ _ts = str(current_date_to_day())
275
+ _message = "user" + self.message_key_val_sep +_user + self.message_key_sep + \
276
+ "user_avatar" + self.message_key_val_sep + _user_logo + self.message_key_sep + \
277
+ "date" + self.message_key_val_sep + _ts + self.message_key_sep + \
278
+ "message" + self.message_key_val_sep + request['message']
279
+ _id = request.get('id', None)
280
+ if _id is not None:
281
+ _id = request['id']
282
+ chat = self.read_chats()
283
+ chat = chat[chat['id'] == int(_id)]
284
+ chat['message'] = chat['message'] + self.message_sep + _message
285
+
286
+ try:
287
+ con.execute(self.update_query(table='chat',
288
+ condition=" id = " + str(_id),
289
+ columns=['message'], values={'message': list(chat['message'])[0]}))
290
+ except Exception as e:
291
+ print()
292
+
293
+ else:
294
+ chat = {'user': _user,
295
+ 'general_message': request['general_message'],
296
+ 'message': _message,
297
+ 'date': _ts,
298
+ 'chart': _chart,
299
+ 'chat_type': 'message',
300
+ 'user_logo': _user + '.png'}
301
+ try:
302
+ con.execute(self.insert_query(table='chat',
303
+ columns=self.sqlite_queries['columns']['chat'][1:],
304
+ values=chat
305
+ ))
306
+ except Exception as e:
307
+ print()
308
+
309
+
310
+