[U] Update project structure

This commit is contained in:
Hykilpikonna
2021-12-13 00:24:20 -05:00
parent d1e36f09a5
commit 1da01de3af
42 changed files with 26 additions and 32 deletions
+1
View File
@@ -127,3 +127,4 @@ dmypy.json
config.json5
data/
/report/
/src/report
+1
View File
@@ -5,6 +5,7 @@ DATA_DIR = '../data'
TWEETS_DIR = f'{DATA_DIR}/twitter/user-tweets'
USER_DIR = f'{DATA_DIR}/twitter/user'
REPORT_DIR = './report'
RES_DIR = './resources'
# Debug mode, or developer mode. This affects two things:
# 1. Whether debug messages are outputted
+3 -6
View File
@@ -1,9 +1,6 @@
from tabulate import tabulate
from process.twitter_process import *
from process.twitter_visualization import *
from raw_collect.twitter import *
from report.report import serve_report
from visualization import *
from collect_twitter import *
from report import serve_report
from utils import *
+9 -11
View File
@@ -1,5 +1,6 @@
import json
import os.path
import shutil
import traceback
import webbrowser
from distutils.dir_util import copy_tree
@@ -7,12 +8,9 @@ from pathlib import Path
from flask import Flask, send_from_directory, Response
from constants import REPORT_DIR, DEBUG
from constants import REPORT_DIR, DEBUG, RES_DIR
from utils import read, write
# Constants
src_dir = Path(os.path.realpath(__file__)).parent
def generate_report() -> str:
"""
@@ -21,7 +19,7 @@ def generate_report() -> str:
:return: Markdown report
"""
# Load markdown
md = read(str(src_dir.joinpath('report_document.md'))).replace('\r\n', '\n').split('\n')
md = read(os.path.join(RES_DIR, './report_document.md')).replace('\r\n', '\n').split('\n')
# Process line by line
for i in range(len(md)):
@@ -71,7 +69,7 @@ def generate_html() -> str:
# Generate markdown report and JSON encode it (which works as JS code! amazing
md_json = json.dumps({'content': generate_report()})
# Inject into HTML
html = read(str(src_dir.joinpath('report_page.html'))) \
html = read(os.path.join(RES_DIR, 'report_page.html')) \
.replace('`{{markdown}}`', md_json)
return html
@@ -83,11 +81,11 @@ def write_html() -> None:
:return: None
"""
if os.path.isdir('./dist'):
os.remove('./dist')
Path('./dist/resources').mkdir(parents=True, exist_ok=True)
shutil.rmtree('./dist')
Path('./dist/html').mkdir(parents=True, exist_ok=True)
write('./dist/index.html', generate_html())
copy_tree(str(src_dir.joinpath('resources/').absolute()), './dist/resources')
copy_tree(os.path.join(RES_DIR, 'html/'), './dist/html')
copy_tree(REPORT_DIR, './dist')
@@ -124,7 +122,7 @@ def serve_report() -> None:
"""
return send_from_directory(Path(REPORT_DIR).absolute(), path)
@app.route('/resources/<path:path>')
@app.route('/html/<path:path>')
def js_res(path: str) -> Response:
"""
JS Resource endpoint. This maps JS and CSS queries to the resources directory
@@ -132,7 +130,7 @@ def serve_report() -> None:
:param path: Path of the resource
:return: File resource or 404
"""
return send_from_directory(os.path.join(src_dir, 'resources'), path)
return send_from_directory(os.path.join(RES_DIR, 'html'), path)
# Run app
webbrowser.open("http://localhost:8080")

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Before

Width:  |  Height:  |  Size: 60 KiB

After

Width:  |  Height:  |  Size: 60 KiB

@@ -80,7 +80,7 @@ $$ \text{pop_ratio}_i = \frac{ \sum_{u \in \text{Users}} \left(\frac{\sum\text{P
After calculation, `freqs` and `pops` are plotted in line graphs against `dates`. Initially, we are seeing graphs with very high peaks such as the graph below. After some investigation, we found that these peaks are caused by not having enough tweets on each day to average out the random error of one single popular tweet. For example, in the graph below, we adjusted the program to print different users' popularity ratios when we found an average popularity ratio of greater than 20, which produced the output on the right. As it turns out, on 2020-07-11, the user @juniorbachchan posted that he and his father tested positive, and that single post is 163.84 times more popular than the average of all his posts. (The post is linked [here](https://twitter.com/juniorbachchan/status/1282018653215395840), it has 235k likes, 25k comments, and 32k retweets). Even though these data points are outliers, there isn't an effective way of removing them since we don't have enough tweets data from each user to calculate their range (for example, someone's COVID-related post might be the only one they've posted). So, we've decided to limit the viewing window to `y = [0, 2]` as shown in the graph on the right.
<div class="image-row">
<div><img src="resources/peak-1.png" alt="graph"></div>
<div><img src="html/peak-1.png" alt="graph"></div>
<div style="display: flex; flex-direction: column; justify-content: center"><pre>
Date: 2020-07-11
- JoeBiden 1.36
@@ -90,7 +90,7 @@ Date: 2020-07-11
- gucci 0.13
- StephenKing 0.61
</pre></div>
<div><img src="resources/peak-2.png" alt="graph"></div>
<div><img src="html/peak-2.png" alt="graph"></div>
</div>
Then, we encountered the issue of noise. When we plot the graph without a filter, we found that the graph is actually very noisy. We decided to average the results over 7 days. Then, we also experimented with different filters from the `scipy` library and different parameter values, and chose to use an IIR filter with `n = 10`.
@@ -3,16 +3,16 @@
<head>
<meta charset="UTF-8">
<title>CSC110 Report</title>
<link rel="stylesheet" href="resources/style.css">
<link rel="stylesheet" href="html/style.css">
</head>
<body>
<div id="content">
</div>
<script src="resources/marked.min.js"></script>
<script src="resources/jquery.min.js"></script>
<script src="resources/polyfill.es6.min.js"></script>
<script src="resources/mathjax-tex-mml-chtml.js"></script>
<script src="html/marked.min.js"></script>
<script src="html/jquery.min.js"></script>
<script src="html/polyfill.es6.min.js"></script>
<script src="html/mathjax-tex-mml-chtml.js"></script>
<script>
@@ -2,20 +2,17 @@
This module uses matplotlib to visualize processed data as graphs. The results are stored in report directory.
The graphs are created after processing the data, for example with filtering and removing outliers.
"""
from datetime import timedelta
from dataclasses import dataclass, field
import os.path
from typing import Optional
import matplotlib.ticker
import numpy as np
import requests
import scipy.signal
from matplotlib import pyplot as plt, font_manager
import matplotlib.dates as mdates
from matplotlib import cm
from process.twitter_process import *
from raw_collect.others import get_covid_cases_us
from constants import RES_DIR
from processing import *
from collect_others import get_covid_cases_us
@dataclass()
@@ -287,7 +284,7 @@ def graph_load_font() -> None:
"""
Load iosevka font for matplotlib
"""
font = Path(os.path.realpath(__file__)).absolute().parent.joinpath('iosevka-ss04-regular.ttf')
font = os.path.join(RES_DIR, 'iosevka-ss04-regular.ttf')
fe = font_manager.FontEntry(font, 'iosevka')
font_manager.fontManager.ttflist.insert(0, fe)
plt.rcParams["font.family"] = "iosevka"