twitter_viz / app.py
johnowhitaker's picture
Update app.py
115ff0b
raw
history blame
2 kB
import streamlit as st
import pandas as pd
import twint
import nest_asyncio
import multiprocessing.pool
import functools
# https://stackoverflow.com/questions/492519/timeout-on-a-function-call
def timeout(max_timeout):
"""Timeout decorator, parameter in seconds."""
def timeout_decorator(item):
"""Wrap the original function."""
@functools.wraps(item)
def func_wrapper(*args, **kwargs):
"""Closure for function."""
pool = multiprocessing.pool.ThreadPool(processes=1)
async_result = pool.apply_async(item, args, kwargs)
# raises a TimeoutError if execution exceeds max_timeout
return async_result.get(max_timeout)
return func_wrapper
return timeout_decorator
# nest_asyncio.apply()
# Function to make this easy for ourselves:
@st.cache
@timeout(120.0)
def get_tweets(username, limit=500, save_name=None):
#nest_asyncio.apply() # Helps avoid RuntimeError: This event loop is already running
# Setup config
c = twint.Config() # Create a config object to store our settings
c.Limit = limit # Max number of tweets to fetch (increments of 20)
c.Username = username # User of interest
c.Pandas = True # Store tweets in a dataframe
c.Hide_output = True # Avoid printing out tweets
# Run the seearch
twint.run.Search(c)
# Get the results and optionally save to a file as well
df = twint.storage.panda.Tweets_df
if save_name != None:
df.to_csv(save_name)
return df
st.title('Test')
st.title(get_tweets('johnowhitaker', 20).shape)
with st.form("my_form"):
st.write("Inside the form")
user = st.text_input("Twitter Username")
n_tweets = st.slider('How Many Tweets', 20, 2000, 20)
# Every form must have a submit button.
submitted = st.form_submit_button("Submit")
if submitted:
st.write("Fetching user", user, "n_tweets", n_tweets)
tweets = get_tweets(user, limit=n_tweets)
st.write(st.dataframe(tweets.head()))
st.write("Outside the form")