Inversiones en 2016

Escribe una solución para reportar la suma de todas las inversiones en el 2016 tiv_2016, para cada asegurado que: - tiene el mismo same tiv_2015 que uno o más asegurados, y - no se encuentra en la misma ciudad con ningún otro asegurado (i.e., (lat, lon) debe ser única). Redondea el tiv_2016 a dos decimales.

#database#subqueries

Tabla: Insurance

+-------------+-------+
| Column Name | Type  |
+-------------+-------+
| pid         | int   |
| tiv_2015    | float |
| tiv_2016    | float |
| lat         | float |
| lon         | float |
+-------------+-------+

- pid es la llave primaria (columna con valores únicos).
- Cada fila contiene información de cada asegurado, donde:
    - pid es el ID del asegurado.
    - tiv_2015 representa el valor invertido en 2015 y tiv_2016 en 2016.
    - lat es la latitud de la ciudad del asegurado. Se garantiza que no es NULL.
    - lon es la longitud de la ciudad del asegurado. Se garantiza que no es NULL.

El formato del resultado se encuentra en el siguiente ejemplo.

Ejemplo 1:

Entrada:

Tabla Insurance:
+-----+----------+----------+-----+-----+
| pid | tiv_2015 | tiv_2016 | lat | lon |
+-----+----------+----------+-----+-----+
| 1   | 10       | 5        | 10  | 10  |
| 2   | 20       | 20       | 20  | 20  |
| 3   | 10       | 30       | 20  | 20  |
| 4   | 10       | 40       | 40  | 40  |
+-----+----------+----------+-----+-----+

Salida:

+----------+
| tiv_2016 |
+----------+
| 45.00    |
+----------+

Explicación:
- Tanto la primera fila como la última cumplen con las dos condiciones.
- El tiv_2015 = 10 es en mismo como en la 3ra y 4a filas y su ubicación es única.

- La segunda fila no cumple con ninguna de las dos condiciones. Su valor tiv_2015 no se comparte con ningún
  otro asegurado y su ubicación es la misma con el asegurado de la fila 3, por lo cual se descarta también.
- De manera que, el resultado es la suma de los tiv_2016 de la primera y última fila, dándo un total de 45.

Solución:

import pandas as pd

def find_investments(insurance: pd.DataFrame) -> pd.DataFrame:
    dups = insurance[insurance.duplicated(subset=['tiv_2015'], keep=False)]

    location = ['lat', 'lon']
    location_counts = insurance.groupby(location).size().reset_index(name='total')
    unique_lat_lon = location_counts[location_counts['total'] == 1][location]

    merged = dups.merge(unique_lat_lon, on=location)

    return pd.DataFrame({
        'tiv_2016': [merged['tiv_2016'].sum().round(2)]
    })

slackmart blog © 2024