Have you ever wanted to track your tweet activity on Twitter? Then this article is for you. I love how Django’s ORM makes it easy to model a database and modify it with views (i.e., the app’s functional back-end).
In this tutorial, we will be learning how to manage tweet activity using the official Twitter API and generate a heat map from tweets using Arctype. To achieve this, we will be tracking some very popular celebrities’ tweets to create a heatmap like the one in the image above.
Prerequisites
To fully understand this tutorial, you should have the following:
- Python 3.7 or newer.
- Arctype
- Basic understanding of SQL.
- Basic understanding of Django.
- A Twitter developer account.
- A text editor.
Setting up the Twitter API
To make use of the Twitter official API, you need to set up your Twitter developer account. Go to https://developer.twitter.com and signup if you haven’t. To sign up, you will need to provide detailed information on how you want to utilize your access to the Twitter API. After providing the information, you will need to wait for Twitter to verify and enable your account.
When your account is verified, go to your developer dashboard, as seen in the image above.
At this point, you need to create a project which can house multiple applications. First, click on create project
, then give your project a name, use case, and a description.
Now you need to create an application. To do this, click on create a new app and provide a name for your application.
After creating your Twitter application, you will see a page with your application keys, as seen in the image below. Copy and save them somewhere you can easily retrieve them.
Go to the Project menu to then open your project. In the apps section, click on the key icon, then generate an access token
and access secret
token for your application at the bottom of the page displayed.
Click on the generate button, then copy and save the access_token and access_secret_token somewhere you can easily retrieve them.
Getting Started with Django
To create the Django application, run the following code in your command line:
# creating the project
python manage.py startproject TweetsDaily
# change to the project directory
cd TweetsDaily
#creating the app
python manage.py startapp App
Now, go to the settings.py
file and App
to the list of installed apps as seen below:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'App'
]
Next, go to the urls.py
file in the project directory and edit as seen in the code below:
from django.contrib import admin
from django.urls import path, include
from django.conf import settings
urlpatterns = [
path('admin/', admin.site.urls),
path('', include("App.urls")),
]
Finally, go to the App
folder and create a new urls.py
file. Add the python code below to the file and save:
from django.conf import settings
from django.conf.urls.static import static
from django.urls import path, include
from . import views
app_name = "App"
urlpatterns = [
path("", views.index, name="index"),
]
In the code above, we defined the index URL and connected it to the index
view, which we will define in our views.py
file.
Building Our Django Models
Here we will define the table models in the models.py
file as see in the python code below:
from django.db import models
# Create your models here.
from django.db import models
# Create your models here.
class Tweets(models.Model):
username= models.TextField()
tweet_number = models.IntegerField()
created_at = models.IntegerField()
time = models.IntegerField()
retweet_count= models.IntegerField()
def __str__(self):
return self.tweet_number
After saving, we need to migrate the database using the below command in the project directory.
#making migrations
python manage.py makemigrations
#migrating the database
python manage.py migrate
Writing Our Django Views
The views.py
file in the Django project is where we write the main logic for the application.
Importing the Required LIbraries
Copy and paste the python code below at the top of the views.py
file to import the required libraries.
from django.shortcuts import render
from tweepy import OAuthHandler
from tweepy import API
from tweepy import Cursor
from datetime import datetime, date, time, timedelta
from collections import Counter
from django.http import HttpResponse
from . models import Tweets
Initializing Tweepy
Copy and paste the code below in the views.py
file and provide your real keys to initialize Tweepy.
consumer_key="api_key"
consumer_secret="api_secret_key"
access_token="access_token"
access_token_secret="access_token_secret"
auth = OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
auth_api = API(auth,wait_on_rate_limit=True)
We also need to create a list of the usernames of all celebrities whose tweets we want to analyze, as seen in the code below.
username=["Cristiano","BarackObama","rihanna","TheRock"]
Creating the Index View
Copy and paste the python code below in the views.py
file to build the index view. This view is triggered by loading the application in the browser:
def index(request):
tweet_count = 0
for i in username:
try:
for status in Cursor(auth_api.user_timeline, id=i).items():
tweet_count = tweet_count + 1
if status.created_at.year == 2021 and status.created_at.month == 5:
tweets_save= Tweets.objects.create(username=i,tweet_number=tweet_count,created_at=status.created_at.day,time=status.created_at.hour,retweet_count=status.retweet_count)
tweets_save.save()
except:
pass
return HttpResponse('<h1>Loaded Tweets Data</h1>')
In the code above, we are making a request to the Twitter API using Tweepy to retrieve all the user’s tweets. We are now running a loop through the user’s tweets to check for all the tweets made in May 2021. Finally, we will save all the tweets and the number of times the user’s followers retweeted them to the database. The applications will then send an HttpResponse “Loaded Tweets Data” to the application when run.
To run your application, copy and paste the below commands in your command line’s project directory:
#running the application
python manage.py runserver
If the application is running, you should see the result as seen below.
Go to http://127.0.0.1:8000 to view the running application and trigger the index
view to save all the tweet data in the database.
Connecting Arctype to a MySQL Database
To make use of Arctype, we need to connect our database and set up a workspace. To do this, follow the instructions below.
Step 1
Open Arctype, click on “I have an existing database”, and select your database type. For this tutorial, we are using MySQL.
Step 2
Provide the required information for the database and click Save
.
Step 3
You should now see the database in Arctype. Next, go to the Tweets table. You should have something similar to the image below.
Compare Retweets between Accounts Using MySQL
We currently have multiple tweet data for May in the year 2021 saved in the Tweet table. To make a heat map of the data, we need to sum up the retweet count for the tweets created each day in the month of may and group all the tweets that the user’s followers retweeted by the date and username. In addition, because Barack Obama and Rihanna are two of the most-followed people on Twitter, we should factor in the size of each account's following to get a clearer picture in our data.
To achieve this, click on the new query
button, then save and run the SQL query below:
SELECT
username,
(
CASE
WHEN (username = 'rihanna')
THEN (SUM(retweet_count) / 102300000 * 100)
WHEN (username = 'BarackObama')
THEN (SUM(retweet_count) / 129600000 * 100)
WHEN (username = 'TheRock')
THEN (SUM(retweet_count) / 15200000 * 100)
WHEN (username = 'Cristiano')
THEN (SUM(retweet_count) / 92400000 * 100)
END
) AS tweet_heat,
CONCAT('May ', created_at)
FROM
app_tweets
GROUP BY
created_at,
username
ORDER BY
created_at ASC
Running the code above will provide you with data, as seen in the image below.
Build a Twitter Heat Map Chart in Arctype
To create a heat map chart for the tweet data above, follow the instructions below:
Create a New Arctype Dashboard
Create a new tab, then select the New Dashboard
button in the top menu. Then, click on the + Add
button, then select ‘chart.’
Get Chart Data from a Saved Query
Click on Select Chart Data
on the blank dashboard provided.
Edit the title and select the query you saved above (in my case, TweetsDailyStats) as the data source.
Assign Result Columns to Heat Map Axes
Select ‘Heat map’ as chart type, then drag and drop data arranged as seen in the image below.
Customizing an Arctype Heat Map
Finally, go to the advanced tab, then enter “Retweets Per Day” as the y-axis value.
After following the above instructions, you should have a heat map similar to the one in the image below.
The heat map above displays the retweets activity for every tweet made by the four celebrities in May 2021 grouped by the day the celebrity created the tweet.
Other Heat Map Examples
Visualizing User Tweets
Create a new query with the SQL query below. Then, run and save the query.
WITH alldates AS(
SELECT
distinct created_at
FROM
app_tweets
ORDER BY
1
),
alltimes AS(
SELECT
distinct time
FROM
app_tweets
ORDER BY
1
),
timetable AS(
SELECT
*
FROM
alldates,
alltimes
ORDER BY
1
)
SELECT
CONCAT('May ',t.created_at) AS day,
CONCAT(t.time,':00') AS hour,
COUNT(a.tweet_number) as tweets
FROM
timetable t
LEFT OUTER JOIN app_tweets a ON (a.username = 'BarackObama' AND a.created_at = t.created_at AND a.time = t.time)
GROUP BY t.time, t.created_at
ORDER BY t.created_at, t.time
Create a new heat map chart using the query data you saved above. Then, configure the heat map to have the day
field in the x-axis, hour
in the y-axis, and the tweets
in the z-axis.
The heat map above displays every tweet made by one of the celebrities (i.e., Barack Obama) in May 2021, grouped by the day and the hour of the day the user created the tweet.
Querying for a Twitter User's Retweets
Create a new query with the SQL query below. Then, run and save the query.
WITH alldates AS(
SELECT
distinct created_at
FROM
app_tweets
ORDER BY
1
),
alltimes AS(
SELECT
distinct time
FROM
app_tweets
ORDER BY
1
),
timetable AS(
SELECT
*
FROM
alldates,
alltimes
ORDER BY
1
)
SELECT
CONCAT('May ',t.created_at) AS day,
CONCAT(t.time,':00') AS hour,
SUM(a.retweet_count) as retweets
FROM
timetable t
LEFT OUTER JOIN app_tweets a ON (a.username = 'BarackObama' AND a.created_at = t.created_at AND a.time = t.time)
GROUP BY t.time, t.created_at
ORDER BY t.created_at, t.time
Create a new heat map chart using the query data you saved above. Then, configure the heat map to have the day
field in the x-axis, hour
in the y-axis, and the retweets
in the z-axis.
The heat map above displays the retweets activity for every tweet made by one of the celebrities (i.e., Barack Obama) in May 2021, grouped by the day and the hour of the day the user created the tweet.
Visualize Tweets-Retweets Ratio
Create a new query with the SQL query below. Then, run and save the query:
WITH alldates AS(
SELECT
distinct created_at
FROM
app_tweets
ORDER BY
1
),
alltimes AS(
SELECT
distinct time
FROM
app_tweets
ORDER BY
1
),
timetable AS(
SELECT
*
FROM
alldates,
alltimes
ORDER BY
1
)
SELECT
CONCAT('May ',t.created_at) AS day,
CONCAT(t.time,':00') AS hour,
CAST((SUM(a.retweet_count)/COUNT(tweet_number)) AS UNSIGNED) as ratio
FROM
timetable t
LEFT OUTER JOIN app_tweets a ON (a.username = 'BarackObama' AND a.created_at = t.created_at AND a.time = t.time)
GROUP BY t.time, t.created_at
ORDER BY t.created_at, t.time
Create a new heat map chart using the query data you saved above. Then, configure the heat map to have the day
field in the x-axis, hour
in the y-axis, and the ratio
in the z-axis.
Conclusion
In this article, you learned how to track tweet data with Tweepy and visualize them as a heat map on a dashboard with Arctype. In addition, you saw how easy it is to run SQL queries on your database using Arctype and got the chance to explore some of its core features and functionalities.
The source code of the dashboard application and the links to the Arctype SQL dashboard are available on Github. If you have any questions, don't hesitate to contact me on Twitter: @LordChuks3.
Top comments (0)