Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to create a pandas dataframe using Tweepy?

In Python 3 I made program to extract posts and likes in Twitter:

import tweepy
import pandas as pd

consumer_key = ''
consumer_secret = ''
access_token = ''
access_token_secret = ''
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth)

This function receives the didactic classification of profiles (only for database organization) and the name of the profile. It creates a list with dictionaries, which is then returned:

def linhadotempo(posicao, valor):
    tela = api.user_timeline(valor) 
    bolha = []
    for status in tela:
        dicionario = {"nome": valor, "posicionamento": posicao, "posts_links": status.text, "curtidas": status.favorite_count}
        bolha.append(dicionario)
    return bolha

List of names of Twitter profiles and their didactic ratings. Then transformed into a dataframe:

data = {
'nome': ['jeanwyllys_real', 'lucianagenro', 'jairbolsonaro', 'MBLivre'],
'posicionamento': ['esquerda', 'esquerda', 'direita', 'direita']
        }
perfis = pd.DataFrame(data, columns=['nome','posicionamento'])
perfis.reset_index()
    index   nome    posicionamento
0   0   jeanwyllys_real     esquerda
1   1   lucianagenro    esquerda
2   2   jairbolsonaro   direita
3   3   MBLivre     direita

I create a final list to put together the lists created in the function. I do an iteration in the dataframe of the profiles to activate the function

bolhas = []
for num, row in perfis.iterrows():
    bolha = linhadotempo(row['posicionamento'], row['nome'])
    bolhas.append(bolha)

My intention later was to create a final dataframe with this, but it did not work out. My intention was to have the columns "curtidas", "nome", "posicionamento" and "posts_links"

bolhas_final = pd.DataFrame(bolhas)
bolhas_final.reset_index()
index   0   1   2   3   4   5   6   7   8   ...     10  11  12  13  14  15  16  17  18  19
0   0   {'nome': 'jeanwyllys_real', 'posicionamento': ...   {'nome': 'jeanwyllys_real', 'posicionamento': ...   {'nome': 'jeanwyllys_real', 'posicionamento': ...   {'nome': 'jeanwyllys_real', 'posicionamento': ...   {'nome': 'jeanwyllys_real', 'posicionamento': ...   {'nome': 'jeanwyllys_real', 'posicionamento': ...   {'nome': 'jeanwyllys_real', 'posicionamento': ...   {'nome': 'jeanwyllys_real', 'posicionamento': ...   {'nome': 'jeanwyllys_real', 'posicionamento': ...   ...     {'nome': 'jeanwyllys_real', 'posicionamento': ...   {'nome': 'jeanwyllys_real', 'posicionamento': ...   {'nome': 'jeanwyllys_real', 'posicionamento': ...   {'nome': 'jeanwyllys_real', 'posicionamento': ...   {'nome': 'jeanwyllys_real', 'posicionamento': ...   {'nome': 'jeanwyllys_real', 'posicionamento': ...   {'nome': 'jeanwyllys_real', 'posicionamento': ...   {'nome': 'jeanwyllys_real', 'posicionamento': ...   {'nome': 'jeanwyllys_real', 'posicionamento': ...   {'nome': 'jeanwyllys_real', 'posicionamento': ...
1   1   {'nome': 'lucianagenro', 'posicionamento': 'es...   {'nome': 'lucianagenro', 'posicionamento': 'es...   {'nome': 'lucianagenro', 'posicionamento': 'es...   {'nome': 'lucianagenro', 'posicionamento': 'es...   {'nome': 'lucianagenro', 'posicionamento': 'es...   {'nome': 'lucianagenro', 'posicionamento': 'es...   {'nome': 'lucianagenro', 'posicionamento': 'es...   {'nome': 'lucianagenro', 'posicionamento': 'es...   {'nome': 'lucianagenro', 'posicionamento': 'es...   ...     {'nome': 'lucianagenro', 'posicionamento': 'es...   {'nome': 'lucianagenro', 'posicionamento': 'es...   {'nome': 'lucianagenro', 'posicionamento': 'es...   {'nome': 'lucianagenro', 'posicionamento': 'es...   {'nome': 'lucianagenro', 'posicionamento': 'es...   {'nome': 'lucianagenro', 'posicionamento': 'es...   {'nome': 'lucianagenro', 'posicionamento': 'es...   {'nome': 'lucianagenro', 'posicionamento': 'es...   {'nome': 'lucianagenro', 'posicionamento': 'es...   {'nome': 'lucianagenro', 'posicionamento': 'es...
2   2   {'nome': 'jairbolsonaro', 'posicionamento': 'd...   {'nome': 'jairbolsonaro', 'posicionamento': 'd...   {'nome': 'jairbolsonaro', 'posicionamento': 'd...   {'nome': 'jairbolsonaro', 'posicionamento': 'd...   {'nome': 'jairbolsonaro', 'posicionamento': 'd...   {'nome': 'jairbolsonaro', 'posicionamento': 'd...   {'nome': 'jairbolsonaro', 'posicionamento': 'd...   {'nome': 'jairbolsonaro', 'posicionamento': 'd...   {'nome': 'jairbolsonaro', 'posicionamento': 'd...   ...     {'nome': 'jairbolsonaro', 'posicionamento': 'd...   {'nome': 'jairbolsonaro', 'posicionamento': 'd...   {'nome': 'jairbolsonaro', 'posicionamento': 'd...   {'nome': 'jairbolsonaro', 'posicionamento': 'd...   {'nome': 'jairbolsonaro', 'posicionamento': 'd...   {'nome': 'jairbolsonaro', 'posicionamento': 'd...   {'nome': 'jairbolsonaro', 'posicionamento': 'd...   {'nome': 'jairbolsonaro', 'posicionamento': 'd...   {'nome': 'jairbolsonaro', 'posicionamento': 'd...   {'nome': 'jairbolsonaro', 'posicionamento': 'd...
3   3   {'nome': 'MBLivre', 'posicionamento': 'direita...   {'nome': 'MBLivre', 'posicionamento': 'direita...   {'nome': 'MBLivre', 'posicionamento': 'direita...   {'nome': 'MBLivre', 'posicionamento': 'direita...   {'nome': 'MBLivre', 'posicionamento': 'direita...   {'nome': 'MBLivre', 'posicionamento': 'direita...   {'nome': 'MBLivre', 'posicionamento': 'direita...   {'nome': 'MBLivre', 'posicionamento': 'direita...   {'nome': 'MBLivre', 'posicionamento': 'direita...   ...     {'nome': 'MBLivre', 'posicionamento': 'direita...   {'nome': 'MBLivre', 'posicionamento': 'direita...   {'nome': 'MBLivre', 'posicionamento': 'direita...   {'nome': 'MBLivre', 'posicionamento': 'direita...   {'nome': 'MBLivre', 'posicionamento': 'direita...   {'nome': 'MBLivre', 'posicionamento': 'direita...   {'nome': 'MBLivre', 'posicionamento': 'direita...   {'nome': 'MBLivre', 'posicionamento': 'direita...   {'nome': 'MBLivre', 'posicionamento': 'direita...   {'nome': 'MBLivre', 'posicionamento': 'direita...

By showing the content of "bolhas" I believe the error was that append created several lists within the list:

[[{'curtidas': 122,
   'nome': 'jeanwyllys_real',
   'posicionamento': 'esquerda',
   'posts_links': 'A expressão "ideologia de gênero" é uma farsa criada para combater a promoção da igualdade e perpetrar a violência… https:///lWdLANLzc5'},
  {'curtidas': 316,
   'nome': 'jeanwyllys_real',
   'posicionamento': 'esquerda',
   'posts_links': 'O termo fantasioso "ideologia de gênero" foi criado por aqueles que falam em "ditadura gay". Quando o ministro ileg… https:///zv2aY31X9p'},
...
 [{'curtidas': 378,
   'nome': 'lucianagenro',
   'posicionamento': 'esquerda',
   'posts_links': 'Que coisa mais ridícula o ministro da Educação falando em rede nacional que a nova base curricular "está sendo entr… https:///h6l95GhdWT'},
...
{'curtidas': 500,
   'nome': 'MBLivre',
   'posicionamento': 'direita',
   'posts_links': 'URGENTE: Lula pede 1 milhão de reais em indenização moral a Dallagnol e Justiça nega https://d9vVwRH2IS via @'}]]

Is there a correct way to merge the created lists into one? I would like to keep this structure when creating a dataframe.

like image 517
Reinaldo Chaves Avatar asked Dec 21 '17 13:12

Reinaldo Chaves


1 Answers

Importing the required libraries that we are going to use:

import pandas as pd
import numpy as np
import tweepy
import json

Providing our keys to connect to Twitter API:

consumer_key = '....'
consumer_secret = '....'
access_token = '....'
access_secret = '....'

The next step is creating an OAuthHandler instance...

auth = tweepy.OAuthHandler(consumer_key, consumer_secret)

...and then gain access to the Twitter API.

auth.set_access_token(access_token, access_secret)

Finally we create an API object that we are going to use it to fetch the tweets:

api = tweepy.API(auth, wait_on_rate_limit=True, wait_on_rate_limit_notify=True)

Fetching the last 20 tweets from FC Barcelona twitter account:

last_20_tweets_of_FC_Barcelona = api.user_timeline('FCBarcelona')

Then in this code block we isolate the json part of each tweepy status object that we have downloaded and we add them all into a list....

my_list_of_dicts = []
for each_json_tweet in last_20_tweets_of_FC_Barcelona:
    my_list_of_dicts.append(each_json_tweet._json)

...and then we write this list into a txt file:

with open('tweet_json_Barca.txt', 'w') as file:
        file.write(json.dumps(my_list_of_dicts, indent=4))

Now we are going to create a DataFrame from the tweet_json.txt file:

my_demo_list = []
with open('tweet_json_Barca.txt', encoding='utf-8') as json_file:  
    all_data = json.load(json_file)
    for each_dictionary in all_data:
        tweet_id = each_dictionary['id']
        text = each_dictionary['text']
        favorite_count = each_dictionary['favorite_count']
        retweet_count = each_dictionary['retweet_count']
        created_at = each_dictionary['created_at']
        my_demo_list.append({'tweet_id': str(tweet_id),
                             'text': str(text),
                             'favorite_count': int(favorite_count),
                             'retweet_count': int(retweet_count),
                             'created_at': created_at,
                            })
        #print(my_demo_list)
        tweet_json = pd.DataFrame(my_demo_list, columns = 
                                  ['tweet_id', 'text', 
                                   'favorite_count', 'retweet_count', 
                                   'created_at'])
like image 137
Nikos Tavoularis Avatar answered Sep 28 '22 06:09

Nikos Tavoularis