master
parent
4411bc1601
commit
aa04b09e7f
|
@ -0,0 +1,3 @@
|
|||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
|
@ -0,0 +1,3 @@
|
|||
<component name="ProjectDictionaryState">
|
||||
<dictionary name="da2001" />
|
||||
</component>
|
|
@ -0,0 +1,10 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="PYTHON_MODULE" version="4">
|
||||
<component name="NewModuleRootManager">
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<excludeFolder url="file://$MODULE_DIR$/venv" />
|
||||
</content>
|
||||
<orderEntry type="jdk" jdkName="Python 3.9 (epam_diplom)" jdkType="Python SDK" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
|
@ -0,0 +1,6 @@
|
|||
<component name="InspectionProjectProfileManager">
|
||||
<settings>
|
||||
<option name="USE_PROJECT_PROFILE" value="false" />
|
||||
<version value="1.0" />
|
||||
</settings>
|
||||
</component>
|
|
@ -0,0 +1,7 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.9 (epam_diplom)" project-jdk-type="Python SDK" />
|
||||
<component name="PyCharmProfessionalAdvertiser">
|
||||
<option name="shown" value="true" />
|
||||
</component>
|
||||
</project>
|
|
@ -0,0 +1,8 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/epam_diplom.iml" filepath="$PROJECT_DIR$/.idea/epam_diplom.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
Binary file not shown.
|
@ -0,0 +1,27 @@
|
|||
from datetime import datetime, date
|
||||
|
||||
|
||||
def check_date(input_date):
|
||||
try:
|
||||
datetime.strptime(input_date, '%Y-%m-%d').date()
|
||||
return True
|
||||
# valid_date = datetime.strptime(input_date, '%Y-%m-%d').date()
|
||||
# if valid_date < date.today():
|
||||
# return True
|
||||
# else:
|
||||
# print('Введенная дата еще не наступила')
|
||||
# return False
|
||||
except ValueError:
|
||||
return False
|
||||
|
||||
|
||||
while True:
|
||||
input_day = input('Введите дату в формате ГГГГ-ММ-ДД): ')
|
||||
if check_date(input_day):
|
||||
print('Введенная дата корректна')
|
||||
break
|
||||
else:
|
||||
print('Введенная дата некорректна')
|
||||
continue
|
||||
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
from flask import Flask, render_template
|
||||
|
||||
app = Flask(__name__)
|
||||
|
||||
|
||||
@app.route('/')
|
||||
@app.route('/index')
|
||||
def index():
|
||||
return '<h1>Hello, World!</h1>'
|
||||
|
||||
|
||||
@app.route('/sum/<int:a>/<int:b>')
|
||||
def summa(a, b):
|
||||
return str(a + b)
|
||||
|
||||
|
||||
"""
|
||||
Типы динамических переменных
|
||||
string принимает любые строки (значение по умолчанию)
|
||||
int принимает целые числа
|
||||
float принимает числа с плавающей точкой
|
||||
path принимает полный путь включая слэши и завершающий слэш
|
||||
uuid принимает строки uuid (символьные id)
|
||||
"""
|
||||
|
||||
if __name__ == "__main__":
|
||||
app.run(host='127.0.0.1', port=8181)
|
|
@ -0,0 +1,80 @@
|
|||
import json
|
||||
from flask import Flask, render_template, request
|
||||
from datetime import datetime, date
|
||||
|
||||
import requests
|
||||
|
||||
url = 'https://covidtrackerapi.bsg.ox.ac.uk/api/v2/stringency/actions/'
|
||||
'''
|
||||
01. Belarus - BLR
|
||||
02. China - CHN
|
||||
03. France - FRA
|
||||
04. Germany - DEU
|
||||
05. India - IND
|
||||
06. Israel - ISR
|
||||
07. Russia - RUS
|
||||
08. Serbia - SRB
|
||||
09. Spain - ESP
|
||||
10. Turkey - TUR
|
||||
'''
|
||||
countries = ['blr', 'chn', 'fra', 'deu', 'ind', 'isr', 'rus', 'srb', 'esp', 'tur']
|
||||
tmp_output = {}
|
||||
|
||||
|
||||
def check_date(input_date):
|
||||
""" Check date format from input string.
|
||||
|
||||
Args: input_date - (str).
|
||||
Return: Bool - True if date correct. """
|
||||
try:
|
||||
# valid_date = datetime.strptime(input_date, '%Y-%m-%d').date()
|
||||
datetime.strptime(input_date, '%Y-%m-%d').date()
|
||||
return True
|
||||
except ValueError:
|
||||
return False
|
||||
|
||||
|
||||
def request_one_country(api, cntr, day):
|
||||
""" Request from api-url.
|
||||
|
||||
Args: api - (str) - api url,
|
||||
cntr - (str) country alpha-3 code,
|
||||
day - (int) YYYY-MM-DD.
|
||||
Return: Response - (dict). """
|
||||
r_out = requests.get(f'{api}{cntr}/{day}')
|
||||
return r_out.json()
|
||||
|
||||
######################################################
|
||||
|
||||
|
||||
app = Flask(__name__)
|
||||
|
||||
|
||||
@app.route('/', methods=['post', 'get'])
|
||||
def index():
|
||||
if request.method == 'POST':
|
||||
input_date = request.form.get('input_date') # запрос к данным формы
|
||||
if check_date(input_date):
|
||||
correct_date = datetime.strptime(input_date, '%Y-%m-%d').date()
|
||||
if correct_date >= date.today():
|
||||
return render_template('index.html', message='Input date has not arrived yet')
|
||||
|
||||
for country in countries:
|
||||
out = request_one_country(url, country, correct_date)
|
||||
tmp_output.setdefault(country, out.get('stringencyData'))
|
||||
|
||||
output = {input_date: tmp_output}
|
||||
with open('../temp_out.json', 'w') as f:
|
||||
json.dump(output, f, sort_keys=True, indent=2)
|
||||
|
||||
return render_template('index.html')
|
||||
elif not input_date:
|
||||
return render_template('index.html', message='Please input date')
|
||||
else:
|
||||
return render_template('index.html', message='Incorrect input')
|
||||
else:
|
||||
return render_template('index.html')
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
app.run(host='127.0.0.1', port=8181, debug=True)
|
Binary file not shown.
After Width: | Height: | Size: 39 KiB |
Binary file not shown.
After Width: | Height: | Size: 21 KiB |
|
@ -0,0 +1,3 @@
|
|||
body {
|
||||
color: blue;
|
||||
}
|
|
@ -0,0 +1,30 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>COVID-19 Some statistics</title>
|
||||
<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
|
||||
</head>
|
||||
<body>
|
||||
<p>Some statistics</p>
|
||||
<img src="{{ url_for('static', filename='img/covid19.png') }}"
|
||||
alt="Img" width="300">
|
||||
<!-- alt="Img" width="300" height="300">-->
|
||||
|
||||
<form action="" method="post">
|
||||
<p>
|
||||
<label for="input_date">Input date (YYYY-MM-DD)</label>
|
||||
<input type="text" name="input_date">
|
||||
<input type="submit" value="Show">
|
||||
</p>
|
||||
<!-- <p>-->
|
||||
<!-- <input type="submit" value="Show">-->
|
||||
<!-- </p>-->
|
||||
</form>
|
||||
{{ message }}
|
||||
|
||||
</body>
|
||||
</html>
|
||||
<!--<script>-->
|
||||
<!-- alert('Эй!')-->
|
||||
<!--</script>-->
|
|
@ -0,0 +1,25 @@
|
|||
from datetime import datetime
|
||||
|
||||
from flask import Flask
|
||||
from flask_sqlalchemy import SQLAlchemy
|
||||
|
||||
app = Flask(__name__)
|
||||
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'
|
||||
'''
|
||||
postgresql://user:password@localhost/mydatabase
|
||||
mysql://user:password@localhost/mydatabase
|
||||
oracle://user:password@127.0.0.1:1521/mydatabase
|
||||
'''
|
||||
|
||||
db = SQLAlchemy(app)
|
||||
|
||||
|
||||
class Users(db.Model):
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
email = db.Column(db.String(50), unique=True)
|
||||
psw = db.Column(db.String(500), nullable=True)
|
||||
date = db.Column(db.DateTime, default=datetime.utcnow)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
app.run(debug=True)
|
|
@ -0,0 +1,135 @@
|
|||
import sys, getopt
|
||||
import argparse
|
||||
import datetime
|
||||
import re
|
||||
import json
|
||||
import os
|
||||
import requests
|
||||
import MySQLdb #need sudo apt-get install python-mysqldb (for debian based distros), yum install MySQL-python (for rpm-based), or dnf install python-mysql (for modern fedora distro) in command line to download
|
||||
|
||||
start_date = '2021-01-1'
|
||||
end_date = '2021-06-01'
|
||||
url = 'https://covidtrackerapi.bsg.ox.ac.uk/api/v2/stringency/date-range/'
|
||||
|
||||
try:
|
||||
os.environ["DB_HOST"]
|
||||
except KeyError:
|
||||
print ("Please set the environment variable DB_HOST")
|
||||
sys.exit(1)
|
||||
|
||||
try:
|
||||
os.environ["DB_USER"]
|
||||
except KeyError:
|
||||
print ("Please set the environment variable DB_USER")
|
||||
sys.exit(1)
|
||||
|
||||
try:
|
||||
os.environ["DB_PASS"]
|
||||
except KeyError:
|
||||
print ("Please set the environment variable DB_PASS")
|
||||
sys.exit(1)
|
||||
|
||||
try:
|
||||
os.environ["DB_NAME"]
|
||||
except KeyError:
|
||||
print ("Please set the environment variable DB_NAME")
|
||||
sys.exit(1)
|
||||
|
||||
db_host = os.environ.get('DB_HOST')
|
||||
|
||||
print("DBHOST IS ", os.environ.get('DB_HOST'))
|
||||
|
||||
db_user = os.environ.get('DB_USER')
|
||||
db_pass = os.environ.get('DB_PASS')
|
||||
db_name = os.environ.get('DB_NAME')
|
||||
|
||||
query_insert = """INSERT INTO covid (date_value,country_code,confirmed,deaths,stringency_actual,stringency) VALUES (%s,%s,%s,%s,%s,%s)"""
|
||||
query_select = """SELECT date_value,country_code,confirmed,deaths,stringency_actual,stringency FROM covid"""
|
||||
query_create = """CREATE TABLE IF NOT EXISTS covid (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
date_value VARCHAR(255) NOT NULL,
|
||||
country_code VARCHAR(255) NOT NULL,
|
||||
confirmed INT,
|
||||
deaths INT,
|
||||
stringency_actual FLOAT,
|
||||
stringency FLOAT)"""
|
||||
qurey_unique_index = """CREATE UNIQUE INDEX ix_uq ON covid (date_value, country_code)"""
|
||||
query_update = """INSERT IGNORE INTO covid (date_value,country_code,confirmed,deaths,stringency_actual,stringency) VALUES (%s,%s,%s,%s,%s,%s)"""
|
||||
|
||||
# Initialising database connection
|
||||
try:
|
||||
db = MySQLdb.connect(host = db_host, # host, usually localhost
|
||||
user = db_user, # username
|
||||
passwd = db_pass, # password
|
||||
db = db_name) # of the data base
|
||||
except ValueError:
|
||||
raise ValueError("No datatbase connect")
|
||||
|
||||
def create_table(url, start, end):
|
||||
print ("Creating table \"covid\"")
|
||||
cur = db.cursor()
|
||||
try:
|
||||
cur.execute(query_create)
|
||||
except ValueError:
|
||||
raise ValueError("Something go wrong while creating table")
|
||||
print("Getting data from ", url + str(start) + '/' + str(end))
|
||||
r = requests.get(url + str(start) + '/' + str(end))
|
||||
data = r.json()
|
||||
print("Opening database")
|
||||
cur = db.cursor()
|
||||
print("Parsing data and inserting it to database")
|
||||
for date in data["data"]:
|
||||
for country in data["data"][date]:
|
||||
try:
|
||||
cur.execute(query_insert, (data["data"][date][country]["date_value"], data["data"][date][country]["country_code"], data["data"][date][country]["confirmed"], data["data"][date][country]["deaths"], data["data"][date][country]["stringency_actual"],data["data"][date][country]['stringency']))
|
||||
except ValueError:
|
||||
raise ValueError("Something go wrong while inserting new data")
|
||||
print("Creating unique indexes for date_value and country_code fields")
|
||||
try:
|
||||
cur.execute(qurey_unique_index)
|
||||
except ValueError:
|
||||
raise ValueError("Something go wrong while creating indexes")
|
||||
print("Commititng data")
|
||||
db.commit()
|
||||
print("Closing database")
|
||||
cur.close()
|
||||
return("DB created and data has been inserted from: " + start_date + " to: " + end_date )
|
||||
|
||||
def update_data(url, start, end):
|
||||
# Getting data from API and inserting it to database
|
||||
print("Getting data from ", url + str(start) + '/' + str(end))
|
||||
r = requests.get(url + str(start) + '/' + str(end))
|
||||
data = r.json()
|
||||
print("Opening database")
|
||||
cur = db.cursor()
|
||||
print("Parsing data and inserting it to database")
|
||||
for date in data["data"]:
|
||||
for country in data["data"][date]:
|
||||
try:
|
||||
cur.execute(query_update, (data["data"][date][country]["date_value"], data["data"][date][country]["country_code"], data["data"][date][country]["confirmed"], data["data"][date][country]["deaths"], data["data"][date][country]["stringency_actual"],data["data"][date][country]['stringency']))
|
||||
except ValueError:
|
||||
raise ValueError("Something go wrong while inserting new data")
|
||||
print("Commititng data")
|
||||
db.commit()
|
||||
print("Closing database")
|
||||
cur.close()
|
||||
return("DB has been update to: " + end_date )
|
||||
|
||||
def select_data():
|
||||
# Selecting data drom database
|
||||
print("Opening database")
|
||||
cur = db.cursor()
|
||||
print("Selecting data from database")
|
||||
try:
|
||||
cur.execute(query_select)
|
||||
except ValueError:
|
||||
print("Something going wrong. Select didn't working. I'll check if table exist and if no I'll fix it")
|
||||
create_table(url, start_date, end_date)
|
||||
raise ValueError("Cannot get data from DB")
|
||||
row_headers=[h[0] for h in cur.description]
|
||||
results = cur.fetchall()
|
||||
j_data=[]
|
||||
for result in results:
|
||||
j_data.append(dict(zip(row_headers, result)))
|
||||
cur.close()
|
||||
return j_data
|
|
@ -0,0 +1,64 @@
|
|||
{
|
||||
"2022-03-08": {
|
||||
"blr": {
|
||||
"confirmed": 932949,
|
||||
"country_code": "BLR",
|
||||
"date_value": "2022-03-08",
|
||||
"deaths": 6594,
|
||||
"stringency": 23.15,
|
||||
"stringency_actual": 23.15
|
||||
},
|
||||
"chn": {
|
||||
"msg": "Data unavailable"
|
||||
},
|
||||
"deu": {
|
||||
"confirmed": 16326087,
|
||||
"country_code": "DEU",
|
||||
"date_value": "2022-03-08",
|
||||
"deaths": 124769,
|
||||
"stringency": 80.56,
|
||||
"stringency_actual": 80.56
|
||||
},
|
||||
"esp": {
|
||||
"confirmed": 11159574,
|
||||
"country_code": "ESP",
|
||||
"date_value": "2022-03-08",
|
||||
"deaths": 100859,
|
||||
"stringency": 33.8,
|
||||
"stringency_actual": 33.8
|
||||
},
|
||||
"fra": {
|
||||
"confirmed": 22530160,
|
||||
"country_code": "FRA",
|
||||
"date_value": "2022-03-08",
|
||||
"deaths": 136539,
|
||||
"stringency": 69.44,
|
||||
"stringency_actual": 69.44
|
||||
},
|
||||
"ind": {
|
||||
"confirmed": 42975883,
|
||||
"country_code": "IND",
|
||||
"date_value": "2022-03-08",
|
||||
"deaths": 515355,
|
||||
"stringency": 71.76,
|
||||
"stringency_actual": 71.76
|
||||
},
|
||||
"isr": {
|
||||
"confirmed": 3688096,
|
||||
"country_code": "ISR",
|
||||
"date_value": "2022-03-08",
|
||||
"deaths": 10322,
|
||||
"stringency": 21.3,
|
||||
"stringency_actual": 21.3
|
||||
},
|
||||
"rus": {
|
||||
"msg": "Data unavailable"
|
||||
},
|
||||
"srb": {
|
||||
"msg": "Data unavailable"
|
||||
},
|
||||
"tur": {
|
||||
"msg": "Data unavailable"
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue