Se cuenta con un archivo csv con usuarios de Twitter cuyo formato es
id_usuario, alias, nombrey otro archivo csv con tweets de formatoid_usuario, tweet,fecha. Se pide realizar una función que reciba los dos nombres de archivo y genere un nuevo archivo con el formato"<nombre>,<tweet>".
In [ ]:
import csv
def vincular_nombres_y_tweets(archivo_usuarios, archivo_tweets, archivo_resultado=""):
"""
Genera un nuevo archivo con los tweets viculados a sus respectivos emisores a partir de un archivo de usuarios y otro de tweets
Args:
- arch_usuarios (str): nombre del archivo csv con los usuarios de twitter
- arch_tweets (str): nombre del archivo csv con los tweets por usuario
"""
if not archivo_resultado:
archivo_resultado = archivo_tweets +".res"
with open(archivo_usuarios) as a_usuarios, \
open(archivo_tweets) as a_tweets, \
open(archivo_resultado) as a_resultado:
reader_usuarios = csv.reader(a_usuarios, delimiter=";")
reader_tweets = csv.reader(a_tweets, delimiter=";")
writer_resultado = csv.writer(a_resultado, delimiter=";")
# Si leemos el final del archivo, next da una excepcion.
# Como segundo parametro, definimos un valor en caso de que hayamos llegado al final (None)
if not next(reader_usuarios,None):
#Podria no tener datos, pero necesariamente deberia tener el encabezado
raise ValueError ("El archivo de usuarios esta completamente vacio")
if not next(reader_tweets,None):
#Podria no tener datos, pero necesariamente deberia tener el encabezado
raise ValueError ("El archivo de tweets esta completamente vacio")
tweet = next(reader_tweets, None)
for datos_usuario in reader_usuarios:
if len(datos_usuario) < 3:
continue #Omitimos las lineas mal formadas (nos faltaria algun dato)
while tweet != None: # tweet != None chequea si no hay mas tweets a leer
if len(tweet) < 2 :
tweet = next(reader_tweets, None)
continue
if usuario[0] != tweet[0]:
break
writer_resultado.writerow( (usuario[2],tweet[1]) )
vincular_nombres_y_tweets("usuarios_twitter.csv", "tweets.csv")
Se cuenta con un archivo csv con actividad de twitter. El mismo tiene el formato
alias;fecha;tweet;retweets;likes, y está ordenado por alias y luego por fecha. Queremos analizar la popularidad de los usuarios en base a su actividad y para eso necesitamos ver cuántas interacciones tuvieron sus tweets durante en función de los días. Se pide realizar una función que reciba el nombre del archivo como parámetro e imprima por pantalla la cantidad de likes y retweets separados por usuario y por fecha. Un ejemplo de salida de la función es el siguiente:
gvrossum:
- 04/05/2017: 4 tweets, 1535 retweets, 3518 likes
- 04/17/2017: 2 tweets, 758 retweets, 553 likes
- 04/21/2017: 5 tweets, 1153 retweets, 2650 likes
toddmotto:
- 04/04/2017: 2 tweets, 3157 retweets, 3666 likes
- 04/15/2017: 4 tweets, 428 retweets, 3179 likes
davidfowler:
- 03/05/2017: 3 tweets, 217 retweets, 655 likes
- 04/10/2017: 3 tweets, 87 retweets, 567 likes
In [ ]:
import csv
def mostrar_interacciones(arch_tweets):
"""
Imprime por pantalla un resumen de interacciones de tweets agrupado por usuario y fecha
Args:
- arch_tweets (str): nombre del archivo csv con los tweets por usuario y fecha
"""
with open(arch_tweets) as a_tweets:
reader = csv.DictReader(a_tweets, delimiter=";") # DictReader ya sabe que la primera linea es la cabecera
prox_tweet = next(reader, None)
tweets = 0
retweets = 0
likes = 0
while prox_tweet:
alias = prox_tweet['alias']
fecha = prox_tweet['fecha']
print("{}:".format(alias)) # imprimimos el alias del usuario para el que procesaremos la actividad
while prox_tweet and prox_tweet['alias'] == alias:
fecha = prox_tweet['fecha']
while prox_tweet and prox_tweet['fecha'] == fecha:
tweets += 1
retweets += int(prox_tweet['retweets']) # convertimos a int porque el reader devuelve todo como string
likes += int(prox_tweet['likes'])
prox_tweet = next(reader, None)
print("- {}: {} tweets, {} retweets, {} likes".format(fecha, tweets, retweets, likes))
tweets = 0
retweets = 0
likes = 0
mostrar_interacciones("actividad_twitter.csv")