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.
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)]
})