HIPÓTESIS: Query con usuarios de Mexico

in Aliento2 years ago

image.png

El amigo @eddiespino me solicitó unos días ayuda para ver cuantos Mexicanos están en Hive, siendo una tarea muy difícil porque en Hive la ubicación geográfica no es un requisito; sin embargo, podemos crear un promedio, usando algunos para parámetros como el tag de los post, comunidad de México en Hive...

Todo lo haré utilizando HiveSQL con Python porque es un poco más fácil de manipular los datos.

Lo primero que hago es probar la manera de extraer los datos desde HiveSQL, así que procedí a realizar diferentes operaciones y tantas pruebas puede extraer los datos de la siguiente manera:

SELECT COALESCE(Tags.author, Categories.author) AS author,
COALESCE(Tags.json_metadata, Categories.json_metadata) AS json_metadata,
COALESCE(Tags.reputation_ui, Categories.reputation_ui) AS reputation_ui,
COALESCE(Tags.last_post, Categories.last_post) AS last_post
FROM
(
    SELECT Comments.author AS author, MAX(Accounts.last_post) AS last_post, Accounts.json_metadata, Accounts.reputation_ui
    FROM Tags
    INNER JOIN Comments ON Tags.comment_id = Comments.ID
    INNER JOIN Accounts ON Comments.author = Accounts.name
    WHERE Comments.depth = 0 AND Comments.created >= '2023-03-20 00:00:00' AND Comments.created <= '2023-04-08 23:59:59'
    AND Tags.tag IN ('mexico', 'hivemexico')
    GROUP BY Comments.author, Accounts.json_metadata, Accounts.reputation_ui
) Tags
FULL OUTER JOIN
(
    SELECT Comments.author AS author, MAX(Accounts.last_post) AS last_post, Accounts.json_metadata, Accounts.reputation_ui
    FROM Comments
    INNER JOIN Accounts ON Comments.author = Accounts.name
    WHERE Comments.depth = 0 AND Comments.created >= '2023-03-20 00:00:00' AND Comments.created <= '2023-04-08 23:59:59'
    AND Comments.category = 'hive-147104'
    GROUP BY Comments.author, Accounts.json_metadata, Accounts.reputation_ui
) Categories ON Tags.author = Categories.author
ORDER BY author ASC;

Esta consulta a HiveSQL está diseñada para obtener una lista de autores que han usado los tags "mexico" o "hivemexico" en sus Post de Hive, así como aquellos que han publicado en la categoría "hive-147104" que es la comunidad de Hive Mexico.

Luego que pude conseguir los datos que queria procedí a llevar todo a Python para que todo se me haga más fácil añadiendo quedando de la siguiente manera:

def bytags(fecha_inicio, fecha_fin):
    # Crear la consulta SQL utilizando las variables de fecha
    query = f"""
    SELECT COALESCE(Tags.author, Categories.author) AS author,
    COALESCE(Tags.reputation_ui, Categories.reputation_ui) AS reputation_ui,
    COALESCE(Tags.last_post, Categories.last_post) AS last_post,
    COALESCE(Tags.json_metadata, Categories.json_metadata) AS json_metadata
    FROM
    (
        SELECT Comments.author AS author, MAX(Accounts.last_post) AS last_post, Accounts.json_metadata, Accounts.reputation_ui
        FROM Tags
        INNER JOIN Comments ON Tags.comment_id = Comments.ID
        INNER JOIN Accounts ON Comments.author = Accounts.name
        WHERE Comments.depth = 0 AND Comments.created >= '{fecha_inicio}' AND Comments.created <= '{fecha_fin}'
        AND Tags.tag IN ('mexico', 'hivemexico')
        GROUP BY Comments.author, Accounts.json_metadata, Accounts.reputation_ui
    ) Tags
    FULL OUTER JOIN
    (
        SELECT Comments.author AS author, MAX(Accounts.last_post) AS last_post, Accounts.json_metadata, Accounts.reputation_ui
        FROM Comments
        INNER JOIN Accounts ON Comments.author = Accounts.name
        WHERE Comments.depth = 0 AND Comments.created >= '{fecha_inicio}' AND Comments.created <= '{fecha_fin}'
        AND Comments.category = 'hive-147104'
        GROUP BY Comments.author, Accounts.json_metadata, Accounts.reputation_ui
    ) Categories ON Tags.author = Categories.author
    ORDER BY author ASC;
    """

    # Ejecutar la consulta y obtener los resultados
    cursor.execute(query)
    resultados = cursor.fetchall()
    column_names = [desc[0] for desc in cursor.description]

    return resultados, column_names


Pero queria comprobar el idioma que usan esos usuarios de Hive que han publicado con esos tags asi que añadí esta función:

def detect_languages(username, cursor):
    query = f"""
    SELECT TOP 10 body
    FROM Comments
    WHERE author = '{username}' AND depth = 0
    ORDER BY created DESC;
    """
    
    cursor.execute(query)
    posts = cursor.fetchall()

    # Si el usuario no tiene publicaciones, retorna una cadena vacía
    if not posts:
        return ''
    
    languages = set()
    for post in posts:
        try:
            language = detect(post[0])
            languages.add(language)
        except:
            pass
            
    return ', '.join(languages)

Con esta función Busca las últimas 10 publicaciones del usuario y detecta el idioma del cuerpo del texto de cada publicación empleando la biblioteca langdetect. Retorna los idiomas detectados en las publicaciones del usuario.

Esto es un valor que me permite añadir una variable más que permitan depurar la base de dato.

Añadiendo más variables, con la siguiente función pude extraer la location que tienen los usuarios en su perfil de Hive:

def parse_and_filter_results(results, cursor):
    parsed_results = []


    for row  in results:
        author, last_post, reputation_ui, json_metadata = row
        location, about = None, None
        if json_metadata:
            try:
                metadata = json.loads(json_metadata)
                about = metadata.get('profile', {}).get('about', '')
                location = metadata.get('profile', {}).get('location', '')
                languages = detect_languages(author, cursor)
                spanish_tag = 1 if has_spanish_tag(author, cursor) else 0
                parsed_results.append((author, reputation_ui, last_post, about, location, languages, spanish_tag))
            except json.JSONDecodeError:
                pass
    return parsed_results

Así que fui añadiendo más funciones y pude llegar a una conclusión:

Existe población de 965 usuarios que han usado el tag #hivemexico #mexico o han publicado en la comunidad de Hive México.
image.png

¿Qué porcentaje de mexicanos representan?

Luego de depurar cerca de 158 usuarios de Venezuela, se eliminaron a aquellos que no son de nacionalidad mexicana, así como a aquellos que no especificaron su ubicación.

De los 728 usuarios restantes, solo alrededor de 50 tienen una ubicación geográfica en México. Se puede asumir que del 25% de los usuarios sin ubicación, alrededor de 103 son mexicanos, lo que lleva a una estimación aproximada de 150 usuarios en total ubicados en México.

Posibles soluciones para ser más detallados

Hacer iniciativas en Hive para identificar usuarios de México
Hacer base de datos anónima
Depurar la lista de usuarios que no tienen ubicación con otros filtros

A considerar

Esta base de dato solo toma a los usuarios que han publicado en Hive, no considera a los que juegan algún juego de Hive u otra aplicación.

Sort:  

Somos muy poquitos. Espero pronto seamos tan fuertes como los hiver de Venezuela. Saludos

¡Eso es lo que se quiere!

Genial, poco a poco nos vamos encontrando.. muchas gracias <3