Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/master'
Browse files Browse the repository at this point in the history
# Conflicts:
#	src/server.py
  • Loading branch information
rashmisankepally committed Nov 24, 2019
2 parents d38438e + 369d3e4 commit 408a3b4
Show file tree
Hide file tree
Showing 6 changed files with 174 additions and 17 deletions.
2 changes: 1 addition & 1 deletion data/sample_data.csv
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
query_number, metric_type (NDCG; MAP; etc), score (float)
query_number,metric_type,score
1, NDCG, 0.078
2, MAP, 1
3, MAP, 2
Expand Down
12 changes: 12 additions & 0 deletions data/sample_two.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
query_number,metric_type,score
1, NDCG, 0.078
2, MAP, 1
3, MAP, 2
4, MAP, 3
5, MAP, 4
6, MAP, 5
7, MAP, 6
8, MAP, 7
9, MAP, 8
10, MAP, 9
11, MAP, 10.0
99 changes: 83 additions & 16 deletions src/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,21 +4,22 @@
import pandas as pd
import redis
import io
import ujson
import collections
from itertools import combinations
from scipy.stats import ttest_ind
from scipy.stats import f_oneway
import numpy as np

app = Flask(__name__)

ALLOWED_EXTENSIONS = {'txt', 'csv'}

POSTGRES_USER = "818_user"
POSTGRES_PW = "818"
POSTGRES_URL = "127.0.0.1:5432"
POSTGRES_DB = "project"

r = redis.Redis(host='localhost', port=6379, db=0)

def allowed_file(filename):
return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS


@app.route('/upload', methods=['GET', 'POST'])
def upload():
if request.method == 'POST':
Expand All @@ -32,15 +33,21 @@ def upload():
if file.filename == '':
flash('No selected file')
return redirect(request.url)

if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
file_contents = file.read()
data = file_contents.decode("utf-8")
data = file_contents.decode("ascii")
df = pd.read_csv(io.StringIO(data), delimiter=',', header='infer')

print(df)

r.sadd("experiments", filename)
r.set(filename, data)

# Average, median, STD, MAD
r.set(filename+"_statistics", df['score'].describe().to_json())

return redirect(url_for('upload', filename=filename))

return '''
<!doctype html>
<title>Upload new File</title>
Expand All @@ -51,21 +58,81 @@ def upload():
</form>
'''

def one_way_anova():
t, p = f_oneway(*data.values())
return p

def t_test():
for list1, list2 in combinations(data.keys(), 2):
t, p = ttest_ind(data[list1], data[list2])
print(list1, list2, p)

def histogram_intersection(a, b):
v = np.minimum(a, b).sum().round(decimals=1)
return v

@app.route('/compare/<experiment_one>/<experiment_two>')
def compare(experiment_one, experiment_two):
exp_one_stats = r.get(experiment_one+'_statistics').decode('utf-8')
exp_two_stats = r.get(experiment_two+'_statistics').decode('utf-8')

exp_one_data = r.get(experiment_one).decode('ascii')
exp_two_data = r.get(experiment_two).decode('ascii')

df_data_1 = pd.read_csv(io.StringIO(exp_one_data), delimiter=',', header='infer')
df_data_2 = pd.read_csv(io.StringIO(exp_two_data), delimiter=',', header='infer')

df_data_2 = df_data_2.rename(columns={"query_number": "query_number_q2", "metric_type": "metric_type_q2", "score": "score_q2"})

df_stats_1 = pd.read_json(exp_one_stats, typ='series')
df_stats_2 = pd.read_json(exp_two_stats, typ='series')

# Calculate P-Value between query results

merged_stats = pd.concat([df_stats_1, df_stats_2], axis=1, sort=False)
merged_stats['absolute_difference'] = merged_stats[0] - merged_stats[1]
print(merged_stats)

merged_data = pd.concat([df_data_1, df_data_2], axis=1, sort=False)
merged_data['absolute_difference'] = merged_data['score'] - merged_data['score_q2']
print(merged_data)

# Correlation, covariance
stats_corr = merged_stats.corr(method=histogram_intersection)
stats_cov = merged_stats.cov()

@app.route('/compare/<path:experiment_one>/<path:experiment_two>')
def compare():
return 'This is the compare function for two experiments.'
data_corr = merged_data.corr(method=histogram_intersection)
data_cov = merged_data.cov()

aggregator = {}
aggregator["merged_stats"] = merged_stats.to_dict()
aggregator["merged_data"] = merged_data.to_dict()
aggregator["stats_corr"] = stats_corr.to_dict()
aggregator["stats_cov"] = stats_cov.to_dict()
aggregator["data_corr"] = data_corr.to_dict()
aggregator["data_cov"] = data_cov.to_dict()
return ujson.dumps(aggregator)

@app.route('/experiment')
def experiment():
return 'This is the view of an experiment'
@app.route('/experiment/<experiment_id>')
def experiment(experiment_id):
return r.get(experiment_id+'_statistics').decode('utf-8')


@app.route('/hello')
@app.route('/')
def hello():
return 'Hello!'

def experiment_list():
experiments = [element.decode("utf-8") for element in r.smembers("experiments")]
return experiments

@app.route('/experiments')
def experiments():
experiment_holder = collections.defaultdict(list)
for element in r.smembers("experiments"):
experiment_holder["experiments"].append(str(element.decode("utf-8")))
return_json = ujson.dumps(experiment_holder)
return return_json

if __name__ == '__main__':

Expand Down
26 changes: 26 additions & 0 deletions src/static/style.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
html { font-family: sans-serif; background: #eee; padding: 1rem; }
body { max-width: 960px; margin: 0 auto; background: white; }
h1 { font-family: serif; color: #377ba8; margin: 1rem 0; }
a { color: #377ba8; }
hr { border: none; border-top: 1px solid lightgray; }
nav { background: lightgray; display: flex; align-items: center; padding: 0 0.5rem; }
nav h1 { flex: auto; margin: 0; }
nav h1 a { text-decoration: none; padding: 0.25rem 0.5rem; }
nav ul { display: flex; list-style: none; margin: 0; padding: 0; }
nav ul li a, nav ul li span, header .action { display: block; padding: 0.5rem; }
.content { padding: 0 1rem 1rem; }
.content > header { border-bottom: 1px solid lightgray; display: flex; align-items: flex-end; }
.content > header h1 { flex: auto; margin: 1rem 0 0.25rem 0; }
.flash { margin: 1em 0; padding: 1em; background: #cae6f6; border: 1px solid #377ba8; }
.post > header { display: flex; align-items: flex-end; font-size: 0.85em; }
.post > header > div:first-of-type { flex: auto; }
.post > header h1 { font-size: 1.5em; margin-bottom: 0; }
.post .about { color: slategray; font-style: italic; }
.post .body { white-space: pre-line; }
.content:last-child { margin-bottom: 0; }
.content form { margin: 1em 0; display: flex; flex-direction: column; }
.content label { font-weight: bold; margin-bottom: 0.5em; }
.content input, .content textarea { margin-bottom: 1em; }
.content textarea { min-height: 12em; resize: vertical; }
input.danger { color: #cc2f2e; }
input[type=submit] { align-self: start; min-width: 10em; }
24 changes: 24 additions & 0 deletions src/templates/base.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<!doctype html>
<title>{% block title %}{% endblock %} - Flaskr</title>
<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
<nav>
<h1>Flaskr</h1>
<ul>
{% if g.user %}
<li><span>{{ g.user['username'] }}</span>
<li><a href="{{ url_for('auth.logout') }}">Log Out</a>
{% else %}
<li><a href="{{ url_for('auth.register') }}">Register</a>
<li><a href="{{ url_for('auth.login') }}">Log In</a>
{% endif %}
</ul>
</nav>
<section class="content">
<header>
{% block header %}{% endblock %}
</header>
{% for message in get_flashed_messages() %}
<div class="flash">{{ message }}</div>
{% endfor %}
{% block content %}{% endblock %}
</section>
28 changes: 28 additions & 0 deletions src/templates/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
{% extends 'base.html' %}

{% block header %}
<h1>{% block title %}Posts{% endblock %}</h1>
{% if g.user %}
<a class="action" href="{{ url_for('blog.create') }}">New</a>
{% endif %}
{% endblock %}

{% block content %}
{% for post in posts %}
<article class="post">
<header>
<div>
<h1>{{ post['title'] }}</h1>
<div class="about">by {{ post['username'] }} on {{ post['created'].strftime('%Y-%m-%d') }}</div>
</div>
{% if g.user['id'] == post['author_id'] %}
<a class="action" href="{{ url_for('blog.update', id=post['id']) }}">Edit</a>
{% endif %}
</header>
<p class="body">{{ post['body'] }}</p>
</article>
{% if not loop.last %}
<hr>
{% endif %}
{% endfor %}
{% endblock %}

0 comments on commit 408a3b4

Please sign in to comment.