de este codigo quiero una lista de users ordenados por numero de tweets y si empatan por…
- User
de este codigo quiero una lista de users ordenados por numero de tweets y si empatan por numero de replys: import tweepy
client = tweepy.Client( bearer_token='AAAAAAAAAAAAAAAAAAAAAPFamQEAAAAAPOx1y2vzxQf8Qjb8J68VCiK6M3E%3DUxjFF0WpJmBedg2mzP8PMLU4OWEZgmaok4B0eByBiSOyLdfilh')
tweets = client.search_recent_tweets(query='autodeterminacio -is:retweet', tweet_fields=['created_at', 'context_annotations', 'public_metrics', 'geo'], expansions=['author_id', 'geo.place_id'], user_fields=['public_metrics'], place_fields=['place_type', 'geo'], max_results=100)
crear un diccionario para mapear los ids de los usuarios con sus nombres y seguidores
users = {} for user in tweets.includes['users']: users[user['id']] = {'username': user['username'], 'followers': user['public_metrics']['followers_count']}
ordenar por bubble sort por reply_count
for i in range(len(tweets.data)): for j in range(0, len(tweets.data) - i - 1): reply_count_ratio_j = tweets.data[j]['public_metrics']['reply_count'] / users[tweets.data[j]['author_id']][ 'followers'] reply_count_ratio_j_plus1 = tweets.data[j + 1]['public_metrics']['reply_count'] /
users[tweets.data[j + 1]['author_id']]['followers'] if reply_count_ratio_j > reply_count_ratio_j_plus1: tweets.data[j], tweets.data[j + 1] = tweets.data[j + 1], tweets.data[j]Crear una lista vacía para guardar el texto de cada tweet
textos = []
for tweet in tweets.data: print("----------------------------------------------") # Obteniendo el id del autor del tweet author_id = tweet.author_id
# Obteniendo el nombre de usuario y los seguidores del autor desde el diccionario username = users[author_id]['username'] followers = users[author_id]['followers'] # Guardar el texto en un fichero txt texto = "User " + str(username) + " Followers " + str(followers) + " " + tweet.text + " - " + str( tweet.created_at) + " - " + " Reply Count " + str( tweet['public_metrics']['reply_count']) textos.append(texto) print(texto)Sobrescribir el fichero con el texto de todos los tweets
with open('fichero.txt', 'w', encoding='utf-8') as f: f.writelines('\n'.join(textos))
Calcular la suma de los followers
total_followers = sum([user['followers'] for user in users.values()])
Calcular la media de los followers
media_followers = total_followers / len(users.values())
Imprimir la media de los followers
print("La media de followers es:", media_followers)
Ordenar la lista de followers
followers_list = sorted([user['followers'] for user in users.values()])
Determinar si la cantidad de usuarios es par o impar
if len(followers_list) % 2 == 0: # Obtener los dos valores centrales middle1 = followers_list[int((len(followers_list) - 1) / 2)] middle2 = followers_list[int(len(followers_list) / 2)]
# Calcular la mediana median_followers = (middle1 + middle2) / 2else: # Obtener el valor central median_followers = followers_list[int(len(followers_list) / 2)]
Imprimir la mediana de followers
print("La mediana de followers es:", median_followers)
- Assistant
Este código utiliza la biblioteca tweepy para acceder a la API de Twitter y buscar tweets recientes que contengan la palabra "autodeterminacio" y que no sean retweets. Luego, crea un diccionario de usuarios con la información del nombre de usuario y la cantidad de seguidores. Ordena la lista de tweets por la cantidad de respuestas (reply_count) y, en caso de empate, por la cantidad de seguidores.
A continuación, se crea una lista utilizando el texto de cada tweet y la guarda en un archivo llamado "fichero.txt". Finalmente, el código calcula la media y la mediana de la cantidad de seguidores de los usuarios en la lista y las imprime en la salida.
Aquí tienes el código modificado para ordenar la lista de usuarios por la cantidad de tweets y en caso de empate, por la cantidad de respuestas (reply_count):
import tweepy client = tweepy.Client( bearer_token='AAAAAAAAAAAAAAAAAAAAAPFamQEAAAAAPOx1y2vzxQf8Qjb8J68VCiK6M3E%3DUxjFF0WpJmBedg2mzP8PMLU4OWEZgmaok4B0eByBiSOyLdfilh') tweets = client.search_recent_tweets(query='autodeterminacio -is:retweet', tweet_fields=['created_at', 'context_annotations', 'public_metrics', 'geo'], expansions=['author_id', 'geo.place_id'], user_fields=['public_metrics'], place_fields=['place_type', 'geo'], max_results=100) # crear un diccionario para mapear los ids de los usuarios con sus nombres y seguidores users = {} for tweet in tweets.data: author_id = tweet.author_id if author_id not in users: users[author_id] = { 'username': tweet.author.username, 'followers': tweet.author.public_metrics.followers_count, 'tweet_count': 1, 'reply_count': tweet.public_metrics.reply_count } else: users[author_id]['tweet_count'] += 1 users[author_id]['reply_count'] += tweet.public_metrics.reply_count # ordenar la lista de usuarios por tweet_count y en caso de empate, por reply_count sorted_users = sorted(users.values(), key=lambda user: (user['tweet_count'], user['reply_count']), reverse=True) # imprimir la lista de usuarios ordenados for user in sorted_users: print("User: {}, Followers: {}, Tweet Count: {}, Reply Count: {}".format( user['username'], user['followers'], user['tweet_count'], user['reply_count']))Este código crea primero un diccionario de usuarios con la información del nombre de usuario, la cantidad de seguidores y las cantidades de tweets y respuestas. Luego, ordena la lista de usuarios por la cantidad de tweets y la cantidad de respuestas en caso de empate, e imprime la lista de usuarios ordenados.
- User
no es mejor crear una variable externa como users_tweets[author-id] o algo asi: line 28, in users[author_id]['tweet_count'] += 1 ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^ KeyError: 'tweet_count'
- Assistant
Tiene razón, hay un error en mi solución anterior; no se debe acceder directamente a los usuarios en el diccionario a medida que se procesa la lista de tweets. Para evitar este problema, se puede crear un diccionario adicional para guardar las cantidades de tweets y respuestas de cada usuario. Aquí hay una implementación corregida del código:
import tweepy client = tweepy.Client( bearer_token='AAAAAAAAAAAAAAAAAAAAAPFamQEAAAAAPOx1y2vzxQf8Qjb8J68VCiK6M3E%3DUxjFF0WpJmBedg2mzP8PMLU4OWEZgmaok4B0eByBiSOyLdfilh') tweets = client.search_recent_tweets(query='autodeterminacio -is:retweet', tweet_fields=['created_at', 'context_annotations', 'public_metrics', 'geo'], expansions=['author_id', 'geo.place_id'], user_fields=['public_metrics'], place_fields=['place_type', 'geo'], max_results=100) # crear un diccionario para mapear los ids de los usuarios con sus nombres y seguidores users = {} for user in tweets.includes['users']: users[user['id']] = { 'username': user['username'], 'followers': user['public_metrics']['followers_count'], 'tweet_count': 0, 'reply_count': 0 } users_tweets_counts = {} for tweet in tweets.data: author_id = tweet.author_id if author_id not in users_tweets_counts: users_tweets_counts[author_id] = { 'tweet_count': 1, 'reply_count': tweet.public_metrics.reply_count } else: users_tweets_counts[author_id]['tweet_count'] += 1 users_tweets_counts[author_id]['reply_count'] +=tweet.public_metrics.reply_count users[author_id]['tweet_count'] = users_tweets_counts[author_id]['tweet_count'] users[author_id]['reply_count'] = users_tweets_counts[author_id]['reply_count'] # ordenar la lista de usuarios por tweet_count y en caso de empate, por reply_count sorted_users = sorted(users.values(), key=lambda user: (user['tweet_count'], user['reply_count']), reverse=True) # imprimir la lista de usuarios ordenados for user in sorted_users: print("User: {}, Followers: {}, Tweet Count: {}, Reply Count: {}".format( user['username'], user['followers'], user['tweet_count'], user['reply_count']))En este código, he corregido el problema creando un nuevo diccionario
users_tweet_countspara guardar las cantidades de tweets y respuestas para cada usuario. Después de procesar cada tweet, se actualiza la información de tweet_count y reply_count en el diccionariousersutilizando el diccionariousers_tweet_counts. Finalmente, se ordena la lista de usuarios por la cantidad de tweets y respuestas y se imprime la lista ordenada. - User
ahora da este error line 34, in users[author_id]['reply_count'] += tweet.public_metrics.reply_count ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ AttributeError: 'dict' object has no attribute 'reply_count'
- Assistant
Mis disculpas nuevamente, mi error en la respuesta anterior. Estaba accediendo incorrectamente a los atributos del tweet. Aquí está el código revisado y corregido:
import tweepy client = tweepy.Client( bearer_token='AAAAAAAAAAAAAAAAAAAAAPFamQEAAAAAPOx1y2vzxQf8Qjb8J68VCiK6M3E%3DUxjFF0WpJmBedg2mzP8PMLU4OWEZgmaok4B0eByBiSOyLdfilh') tweets = client.search_recent_tweets(query='autodeterminacio -is:retweet', tweet_fields=['created_at', 'context_annotations', 'public_metrics', 'geo'], expansions=['author_id', 'geo.place_id'], user_fields=['public_metrics'], place_fields=['place_type', 'geo'], max_results=100) # crear un diccionario para mapear los ids de los usuarios con sus nombres y seguidores users = {} for user in tweets.includes['users']: users[user['id']] = { 'username': user['username'], 'followers': user['public_metrics']['followers_count'], 'tweet_count': 0, 'reply_count': 0 } users_tweets_counts = {} for tweet in tweets.data: author_id = tweet['author_id'] if author_id not in users_tweets_counts: users_tweets_counts[author_id] = { 'tweet_count': 1, 'reply_count': tweet['public_metrics']['reply_count'] } else: users_tweets_counts[author_id]['tweet_count'] += 1 users_tweets_counts[author_id]['reply_count'] += tweet['public_metrics']['reply_count'] users[author_id]['tweet_count'] = users_tweets_counts[author_id]['tweet_count'] users[author_id]['reply_count'] = users_tweets_counts[author_id]['reply_count'] # ordenar la lista de usuarios por tweet_count y en caso de empate, por reply_count sorted_users = sorted(users.values(), key=lambda user: (user['tweet_count'], user['reply_count']), reverse=True) # imprimir la lista de usuarios ordenados for user in sorted_users: print("User: {}, Followers: {}, Tweet Count: {}, Reply Count: {}".format( user['username'], user['followers'], user['tweet_count'], user['reply_count']))He cambiado cómo se accede a los atributos del tweet para evitar más errores de AttributeError: Ahora, en lugar de utilizar la notación de atributo con
tweet.atributo, se accede a los valores del diccionario directamente contweet['atributo']. Esto debería evitar los errores de AttributeError y proporcionar la salida esperada de usuarios ordenados por la cantidad de tweets y respuestas.