Recuento de categorías salariales

Escribe una solución para calcular el número de cuentas bancarias para cada categoría salarial. Las categorías salariales son: - 'Low Salary': Todos los salarios estrictamente menores a $20000. - 'Average Salary': Todos los salarios en el rango inclusivo [$20000, $50000]. - 'High Salary': Todos los salarios estrictamente mayores a $50000. La tabla de resultados debe contener las tres categorías. Si no hay cuentas en una categoría, regrese 0. Regrese el resultado en cualquier orden.

#pandas#advanced-select

Tabla: Accounts

+-------------+------+
| Column Name | Type |
+-------------+------+
| account_id  | int  |
| income      | int  |
+-------------+------+

- account_id es la llave primaria (columna con valores únicos).
- Cada fila contiene información acerca del ingreso mensual de cada cuenta bancaria.

El formato del resultado se muestra en el siguiente ejemplo.

Ejemplo 1:

Entrada:

Tabla Accounts:
+------------+--------+
| account_id | income |
+------------+--------+
| 3          | 108939 |
| 2          | 12747  |
| 8          | 87709  |
| 6          | 91796  |
+------------+--------+

Salida:

+----------------+----------------+
| category       | accounts_count |
+----------------+----------------+
| Low Salary     | 1              |
| Average Salary | 0              |
| High Salary    | 3              |
+----------------+----------------+

Explicación:
- Low Salary: Cuenta 2.
- Average Salary: Ninguna cuenta.
- High Salary: Cuentas 3, 6, y 8.

Solución

import pandas as pd


def count_salary_categories(accounts: pd.DataFrame) -> pd.DataFrame:
    lower, upper = 20000, 50000
    low = accounts[
        accounts.income < lower]['account_id']
    avg = accounts[
        accounts.income.between(lower, upper)]['account_id']
    high = accounts[
        accounts.income > upper]['account_id']

    answer = {
        'Low Salary': low.size,
        'Average Salary': avg.size,
        'High Salary': high.size
    }

    return pd.DataFrame({
        'category': answer.keys(),
        'accounts_count': answer.values(),
    })


def test_count_salary_categories():
    data = [[3, 108939], [2, 12747], [8, 87709], [6, 91796]]
    accounts = pd.DataFrame(
        data, columns=['account_id', 'income']
    ).astype({'account_id': 'Int64', 'income': 'Int64'})
    got = count_salary_categories(accounts)
    expected = pd.DataFrame({
        'category': ['Low Salary', 'Average Salary', 'High Salary'],
        'accounts_count': [1, 0, 3],
    })
    pd.testing.assert_frame_equal(got, expected)

slackmart blog © 2024