[+] Calculate date freq and pop
This commit is contained in:
@@ -25,13 +25,18 @@ class UserFloat:
|
|||||||
class Sample:
|
class Sample:
|
||||||
name: str
|
name: str
|
||||||
users: list[str]
|
users: list[str]
|
||||||
# Total frequencies for each user (sorted)
|
# Total frequencies of all posts for each user across all dates (sorted)
|
||||||
user_freqs: list[UserFloat]
|
user_freqs: list[UserFloat]
|
||||||
# Total popularity ratios for each user (sorted)
|
# Total popularity ratios of all posts for each user across all dates (sorted)
|
||||||
user_pops: list[UserFloat]
|
user_pops: list[UserFloat]
|
||||||
# Tweets by all users in a sample (always sorted by date)
|
# Tweets by all users in a sample (always sorted by date)
|
||||||
tweets: list[Posting]
|
tweets: list[Posting]
|
||||||
|
# dates[i] = The i-th day since the first tweet
|
||||||
|
dates: list[datetime]
|
||||||
|
# date_freqs[i] = Total frequency of all posts from all users in this sample on date[i]
|
||||||
date_freqs: list[float]
|
date_freqs: list[float]
|
||||||
|
# date_pops[i] = Average popularity ratio of all posts from all users in this sample on date[i]
|
||||||
|
date_pops: list[float]
|
||||||
|
|
||||||
def __init__(self, name: str, users: list[str]):
|
def __init__(self, name: str, users: list[str]):
|
||||||
self.name = name
|
self.name = name
|
||||||
@@ -113,6 +118,67 @@ class Sample:
|
|||||||
self.tweets = all_tweets
|
self.tweets = all_tweets
|
||||||
debug('- Done.')
|
debug('- Done.')
|
||||||
|
|
||||||
|
def calculate_change(self) -> None:
|
||||||
|
"""
|
||||||
|
|
||||||
|
Preconditions:
|
||||||
|
- len(self.tweets) > 0
|
||||||
|
- self.tweets != None
|
||||||
|
|
||||||
|
:return: None
|
||||||
|
"""
|
||||||
|
# List indicies are days since the first tweet
|
||||||
|
covid_count = [0]
|
||||||
|
covid_popularity = [0]
|
||||||
|
all_count = [0]
|
||||||
|
all_popularity = [0]
|
||||||
|
current_date = self.tweets[0][:10]
|
||||||
|
i = 0
|
||||||
|
|
||||||
|
# Loop through all tweets
|
||||||
|
for tweet in self.tweets:
|
||||||
|
# Move on to the next date
|
||||||
|
tweet_date = tweet.date[:10]
|
||||||
|
if tweet_date != current_date:
|
||||||
|
current_date = tweet_date
|
||||||
|
covid_count.append(0)
|
||||||
|
covid_popularity.append(0)
|
||||||
|
all_count.append(0)
|
||||||
|
all_popularity.append(0)
|
||||||
|
i += 1
|
||||||
|
|
||||||
|
# Add current tweet data
|
||||||
|
all_count[i] += 1
|
||||||
|
all_popularity[i] += tweet.popularity
|
||||||
|
if tweet.covid_related:
|
||||||
|
covid_count[i] += 1
|
||||||
|
covid_popularity[i] += tweet.popularity
|
||||||
|
|
||||||
|
# Calculate frequency and popularity ratio for each date, which will be our y-axis
|
||||||
|
self.date_freqs = divide_zeros(covid_count, all_count)
|
||||||
|
self.date_pops = divide_zeros(divide_zeros(covid_popularity, covid_count),
|
||||||
|
divide_zeros(all_popularity, all_count))
|
||||||
|
|
||||||
|
# Convert indicies to dates, which will be our x-axis
|
||||||
|
first_date = parse_date(self.tweets[0].date).replace(hour=0, minute=0, second=0)
|
||||||
|
dates = [first_date + timedelta(days=j) for j in range(len(all_count))]
|
||||||
|
|
||||||
|
# Find suitable n
|
||||||
|
for n in range(1, 20, 3):
|
||||||
|
# Reduce noise by averaging results over 7 day frame
|
||||||
|
b = [1.0 / n] * n
|
||||||
|
a = 1
|
||||||
|
f = scipy.signal.lfilter(b, a, self.date_freqs)
|
||||||
|
p = scipy.signal.lfilter(b, a, self.date_pops)
|
||||||
|
|
||||||
|
# plt.title(f'COVID-posting frequency over time for {sample.name} with IIR n = {n}')
|
||||||
|
# plt.plot(dates, f)
|
||||||
|
# plt.show()
|
||||||
|
plt.title(f'COVID-posting popularity ratio over time for {self.name} with IIR n = {n}')
|
||||||
|
plt.plot(dates, p)
|
||||||
|
plt.savefig(f'{REPORT_DIR}/test/{n}.png')
|
||||||
|
plt.clf()
|
||||||
|
|
||||||
|
|
||||||
def load_samples() -> list[Sample]:
|
def load_samples() -> list[Sample]:
|
||||||
"""
|
"""
|
||||||
|
|||||||
Reference in New Issue
Block a user