Calidad y porcentage de las consultas

Podemos definir la calidad de una consulta como: > La media de la relaci贸n entre la valoraci贸n de la consulta y su posici贸n. Tambi茅n definimos el porcentaje de consultas deficientes como: > El porcentaje de todas las consultas con calificaci贸n inferior a 3. Escriba una soluci贸n para encontrar cada query_name, quality y poor_query_percentage. Tanto `quality` como `poor_query_percentage` deben redondearse a dos decimales. Regresa el resultado en cualquier orden.

#database#basic-aggregate

Tabla: Queries

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| query_name  | varchar |
| result      | varchar |
| position    | int     |
| rating      | int     |
+-------------+---------+

- Puede contener filas duplicadas.
- Contiene informaci贸n recolectada de algunas consultas a una base de datos.
- La columna position tiene un valor entre 1 a 500.
- La columna rating tiene un valor entre 1 a 5. Una consulta con una calificaci贸n inferior a 3 es una consulta deficiente.

El formato del resultado se muestra en el siguiente ejemplo.

Ejemplo 1:

Entrada:

Tabla Queries:
+------------+-------------------+----------+--------+
| query_name | result            | position | rating |
+------------+-------------------+----------+--------+
| Dog        | Golden Retriever  | 1        | 5      |
| Dog        | German Shepherd   | 2        | 5      |
| Dog        | Mule              | 200      | 1      |
| Cat        | Shirazi           | 5        | 2      |
| Cat        | Siamese           | 3        | 3      |
| Cat        | Sphynx            | 7        | 4      |
+------------+-------------------+----------+--------+

Output:

+------------+---------+-----------------------+
| query_name | quality | poor_query_percentage |
+------------+---------+-----------------------+
| Dog        | 2.50    | 33.33                 |
| Cat        | 0.66    | 33.33                 |
+------------+---------+-----------------------+

Explicaci贸n:
- quality de las consultas con query_name='Dog' es ((5 / 1) + (5 / 2) + (1 / 200)) / 3 = 2.50
- poor_query_percentage de las consultas con query_name='Dog' es (1 / 3) * 100 = 33.33

- quality de las consultas con query_name='Cat' es ((2 / 5) + (3 / 3) + (4 / 7)) / 3 = 0.66
- poor_query_percentage de las consultas con query_name='Cat' es (1 / 3) * 100 = 33.33

Soluci贸n:

import pandas as pd

def queries_stats(queries: pd.DataFrame) -> pd.DataFrame:
    """Advanced one, after learning about agg."""
    queries['poor_query_percentage'] = (queries['rating'] < 3) * 100
    queries['quality'] = queries['rating'] / queries['position'] + 1e-5

    return queries.groupby('query_name').agg(
        {'quality': 'mean', 'poor_query_percentage': 'mean'}
    ).round(2).reset_index()


def queries_stats_mine(queries: pd.DataFrame) -> pd.DataFrame:
    """First solution."""
    counts = queries.groupby('query_name')['query_name'].count().reset_index(name='total_count')

    quality_sum = queries.groupby('query_name').apply(
        lambda itm: (itm['rating'] / itm['position']).sum()
    ).reset_index(name='sum')

    poor_rating = queries.groupby(by='query_name')['rating'].apply(
        lambda itm: (itm < 3).sum()
    ).reset_index(name='poor_rating_count')

    df = counts.merge(poor_rating).merge(quality_sum)
    df['poor_query_percentage'] = (df['poor_rating_count'] / df['total_count']).round(decimals=2)
    df['quality'] = (df['sum'] / df['total_count'] + 1e-5).round(decimals=2)

    return df.get(['query_name', 'quality', 'poor_query_percentage'])

slackmart blog 漏 2024