Advertisement
JF_Jaramillo

Treble

Oct 24th, 2023
770
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.35 KB | None | 0 0
  1. """
  2. El modelo va así:
  3. COMPANY(id integer, name string, associated_partner string, close_date string)
  4. associated_partner muestra si la compañía la trajo el equipo de asociados, y su valor es el nombre del asociado si fue traida por un asociado, si no, es vacío.
  5.  
  6. CONVERSATIONS(account_id integer, total integer, date date, successful boolean, id integer)
  7. Una compañía puede tener MÚLTIPLES cuentas, en cada cuenta la compañía despliega conversaciones, en la tabla conversaciones se agrupan por dia, cuenta y si son exitosas o no (successful). Por ejemplo en un registro así:
  8. ["A", 200, '2023-02-01', true, 'ak200']
  9. Significa que la cuenta con id 1 (que pertenece a una compañía, tuvo una conversación exitosa con 200 mensajes en la fecha correspondiente)
  10.  
  11. STRIPE_INVOICE(sent_date date, invoice_id string, company_id string, amount integer, currency string)
  12. Stripe es el sistema utilizado para enviar facturas a las compañias, cada compañia puede tener multiples cuentas de stripe. La columan company_id en esta tabla es el id interno que crea stripe por cuenta.
  13.  
  14. COMPANY_IDENTIFIERS(account_identifier integer, company_id integer, stripe_company_ids string)
  15. Esta tabla se encarga de asociar una compañía con las tablas de conversaciones y facturas. Ejemplo:
  16. [1, 1, 'ak_1, ak_2']
  17. [2, 1, 'ak_1, ak_2']
  18.  
  19. Aqui se puede ver que la compania con ID 1 tiene 2 cuentas en conversaciones (ids 1 y 2) y dos cuentas en stripe("ak_1,ak_2")
  20.  
  21. Mes a mes, que porcentaje de las compañias recientemente cerradas fueron exitotas? una compañia cerrada recientemente es una compañia cerrada en los 2 meses previos. Por ejemplo, en Octubre de 2023, las compañias cerradas para ese mes son compañias cerradas en septiembre y octubre
  22.  
  23. una compañia es existosa en un mes especifico si en ese mes la compañia tuvo mas de 1500 conversaciones exitosas
  24.  
  25. En este ejemplo, en el mes de octubre 2023, necesito contar cuantas compañias fueron cerradas en septiembre y octubre, and de ese set de compañias calcular el porcentaje de compañias que desplegaron al menos 1500 conversacones exitosas en octubre
  26.  
  27. MI SOLUCION:
  28. """
  29. import redshift_connector
  30. import matplotlib.pyplot as plt
  31. from datetime import datetime, timedelta
  32. from calendar import monthrange
  33.  
  34. conn = redshift_connector.connect(
  35.     user="user_test",
  36.     password="Password123",
  37.     host="redshift-cluster-datawarehouse.cew9a5azwld4.us-east-1.redshift.amazonaws.com",
  38.     port="5439",
  39.     database="test"
  40. )
  41.  
  42. cursor = conn.cursor()
  43.  
  44. def define_query(month, year):
  45.  
  46.     if(month == 1):
  47.         start_date = datetime(year-1, 12, 1)    
  48.         last_day_of_month = monthrange(year, 1)[1]
  49.         finish_date = datetime(year, 12, last_day_of_month)
  50.     else:
  51.         start_date = datetime(year, month -1, 1)
  52.         last_day_of_month = monthrange(year, month)[1]
  53.         finish_date = datetime(year, month, last_day_of_month)
  54.     actual_date = datetime(year, month, monthrange(year, month)[1])
  55.     actual_date_start = datetime(year, month, 1)
  56.  
  57.     query = f"SELECT c.id, c.close_date, SUM(co.total) AS successful_messages FROM(SELECT id, close_date FROM company WHERE close_date >= '{start_date}' AND close_date <= '{finish_date}') AS closed_companies INNER JOIN company_identifiers ci ON closed_companies.id = ci.company_id INNER JOIN conversations co ON co.account_id = ci.account_identifier INNER JOIN company c on c.id = ci.company_id WHERE co.date >= '{actual_date_start}' AND co.date <= '{actual_date}' AND co.successful = TRUE GROUP BY c.id, c.close_date HAVING SUM(co.total) >= 1500"
  58.  
  59.     query_total = f"select COUNT(*) from company where close_date >= '{start_date}' AND close_date <= '{finish_date}'"
  60.  
  61.     cursor.execute(query)
  62.     results = len(cursor.fetchall())
  63.     cursor.execute(query_total)
  64.     total = cursor.fetchall()[0][0]
  65.     print("RESULTS", results, "TOTAL", total, "PERCENTAGE: ", ((results/total)*100))
  66.     return ((results/total)*100)
  67.  
  68.  
  69. percentages = []
  70.  
  71. for i in range(1,9):
  72.     print("PARA MES ", i)
  73.     percentages.append(define_query(i,2023))
  74.  
  75. print(percentages)
  76.  
  77. month_labels = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug']
  78.  
  79. plt.figure(figsize=(10, 6))
  80. plt.plot(month_labels, percentages, marker='o')
  81.  
  82. plt.xlabel("Month")
  83. plt.ylabel("Percentage of Successful Companies")
  84. plt.title("Percentage of Recently Closed Companies That Were Successful (2023)")
  85.  
  86. plt.grid(True)
  87.  
  88. plt.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement