diff --git a/module1-web-application-development-with-flask/web-app/Pipfile.lock b/module1-web-application-development-with-flask/web-app/Pipfile.lock
new file mode 100644
index 00000000..7432f760
--- /dev/null
+++ b/module1-web-application-development-with-flask/web-app/Pipfile.lock
@@ -0,0 +1,213 @@
+{
+ "_meta": {
+ "hash": {
+ "sha256": "d16f7a62bcdb62791968a3ad723c300ec916c731f220491c920e7d3e3ef55632"
+ },
+ "pipfile-spec": 6,
+ "requires": {
+ "python_version": "3.7"
+ },
+ "sources": [
+ {
+ "name": "pypi",
+ "url": "https://pypi.org/simple",
+ "verify_ssl": true
+ }
+ ]
+ },
+ "default": {
+ "click": {
+ "hashes": [
+ "sha256:8a18b4ea89d8820c5d0c7da8a64b2c324b4dabb695804dbfea19b9be9d88c0cc",
+ "sha256:e345d143d80bf5ee7534056164e5e112ea5e22716bbb1ce727941f4c8b471b9a"
+ ],
+ "version": "==7.1.1"
+ },
+ "flask": {
+ "hashes": [
+ "sha256:13f9f196f330c7c2c5d7a5cf91af894110ca0215ac051b5844701f2bfd934d52",
+ "sha256:45eb5a6fd193d6cf7e0cf5d8a5b31f83d5faae0293695626f539a823e93b13f6"
+ ],
+ "index": "pypi",
+ "version": "==1.1.1"
+ },
+ "flask-sqlalchemy": {
+ "hashes": [
+ "sha256:0078d8663330dc05a74bc72b3b6ddc441b9a744e2f56fe60af1a5bfc81334327",
+ "sha256:6974785d913666587949f7c2946f7001e4fa2cb2d19f4e69ead02e4b8f50b33d"
+ ],
+ "index": "pypi",
+ "version": "==2.4.1"
+ },
+ "itsdangerous": {
+ "hashes": [
+ "sha256:321b033d07f2a4136d3ec762eac9f16a10ccd60f53c0c91af90217ace7ba1f19",
+ "sha256:b12271b2047cb23eeb98c8b5622e2e5c5e9abd9784a153e9d8ef9cb4dd09d749"
+ ],
+ "version": "==1.1.0"
+ },
+ "jinja2": {
+ "hashes": [
+ "sha256:93187ffbc7808079673ef52771baa950426fd664d3aad1d0fa3e95644360e250",
+ "sha256:b0eaf100007721b5c16c1fc1eecb87409464edc10469ddc9a22a27a99123be49"
+ ],
+ "version": "==2.11.1"
+ },
+ "markupsafe": {
+ "hashes": [
+ "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473",
+ "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161",
+ "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235",
+ "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5",
+ "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42",
+ "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff",
+ "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b",
+ "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1",
+ "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e",
+ "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183",
+ "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66",
+ "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b",
+ "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1",
+ "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15",
+ "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1",
+ "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e",
+ "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b",
+ "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905",
+ "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735",
+ "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d",
+ "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e",
+ "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d",
+ "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c",
+ "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21",
+ "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2",
+ "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5",
+ "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b",
+ "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6",
+ "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f",
+ "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f",
+ "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2",
+ "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7",
+ "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"
+ ],
+ "version": "==1.1.1"
+ },
+ "python-dotenv": {
+ "hashes": [
+ "sha256:81822227f771e0cab235a2939f0f265954ac4763cafd806d845801c863bf372f",
+ "sha256:92b3123fb2d58a284f76cc92bfe4ee6c502c32ded73e8b051c4f6afc8b6751ed"
+ ],
+ "index": "pypi",
+ "version": "==0.12.0"
+ },
+ "sqlalchemy": {
+ "hashes": [
+ "sha256:c4cca4aed606297afbe90d4306b49ad3a4cd36feb3f87e4bfd655c57fd9ef445"
+ ],
+ "version": "==1.3.15"
+ },
+ "werkzeug": {
+ "hashes": [
+ "sha256:169ba8a33788476292d04186ab33b01d6add475033dfc07215e6d219cc077096",
+ "sha256:6dc65cf9091cf750012f56f2cad759fa9e879f511b5ff8685e456b4e3bf90d16"
+ ],
+ "version": "==1.0.0"
+ }
+ },
+ "develop": {
+ "astroid": {
+ "hashes": [
+ "sha256:71ea07f44df9568a75d0f354c49143a4575d90645e9fead6dfb52c26a85ed13a",
+ "sha256:840947ebfa8b58f318d42301cf8c0a20fd794a33b61cc4638e28e9e61ba32f42"
+ ],
+ "version": "==2.3.3"
+ },
+ "isort": {
+ "hashes": [
+ "sha256:54da7e92468955c4fceacd0c86bd0ec997b0e1ee80d97f67c35a78b719dccab1",
+ "sha256:6e811fcb295968434526407adb8796944f1988c5b65e8139058f2014cbe100fd"
+ ],
+ "version": "==4.3.21"
+ },
+ "lazy-object-proxy": {
+ "hashes": [
+ "sha256:0c4b206227a8097f05c4dbdd323c50edf81f15db3b8dc064d08c62d37e1a504d",
+ "sha256:194d092e6f246b906e8f70884e620e459fc54db3259e60cf69a4d66c3fda3449",
+ "sha256:1be7e4c9f96948003609aa6c974ae59830a6baecc5376c25c92d7d697e684c08",
+ "sha256:4677f594e474c91da97f489fea5b7daa17b5517190899cf213697e48d3902f5a",
+ "sha256:48dab84ebd4831077b150572aec802f303117c8cc5c871e182447281ebf3ac50",
+ "sha256:5541cada25cd173702dbd99f8e22434105456314462326f06dba3e180f203dfd",
+ "sha256:59f79fef100b09564bc2df42ea2d8d21a64fdcda64979c0fa3db7bdaabaf6239",
+ "sha256:8d859b89baf8ef7f8bc6b00aa20316483d67f0b1cbf422f5b4dc56701c8f2ffb",
+ "sha256:9254f4358b9b541e3441b007a0ea0764b9d056afdeafc1a5569eee1cc6c1b9ea",
+ "sha256:9651375199045a358eb6741df3e02a651e0330be090b3bc79f6d0de31a80ec3e",
+ "sha256:97bb5884f6f1cdce0099f86b907aa41c970c3c672ac8b9c8352789e103cf3156",
+ "sha256:9b15f3f4c0f35727d3a0fba4b770b3c4ebbb1fa907dbcc046a1d2799f3edd142",
+ "sha256:a2238e9d1bb71a56cd710611a1614d1194dc10a175c1e08d75e1a7bcc250d442",
+ "sha256:a6ae12d08c0bf9909ce12385803a543bfe99b95fe01e752536a60af2b7797c62",
+ "sha256:ca0a928a3ddbc5725be2dd1cf895ec0a254798915fb3a36af0964a0a4149e3db",
+ "sha256:cb2c7c57005a6804ab66f106ceb8482da55f5314b7fcb06551db1edae4ad1531",
+ "sha256:d74bb8693bf9cf75ac3b47a54d716bbb1a92648d5f781fc799347cfc95952383",
+ "sha256:d945239a5639b3ff35b70a88c5f2f491913eb94871780ebfabb2568bd58afc5a",
+ "sha256:eba7011090323c1dadf18b3b689845fd96a61ba0a1dfbd7f24b921398affc357",
+ "sha256:efa1909120ce98bbb3777e8b6f92237f5d5c8ea6758efea36a473e1d38f7d3e4",
+ "sha256:f3900e8a5de27447acbf900b4750b0ddfd7ec1ea7fbaf11dfa911141bc522af0"
+ ],
+ "version": "==1.4.3"
+ },
+ "mccabe": {
+ "hashes": [
+ "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42",
+ "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"
+ ],
+ "version": "==0.6.1"
+ },
+ "pylint": {
+ "hashes": [
+ "sha256:3db5468ad013380e987410a8d6956226963aed94ecb5f9d3a28acca6d9ac36cd",
+ "sha256:886e6afc935ea2590b462664b161ca9a5e40168ea99e5300935f6591ad467df4"
+ ],
+ "index": "pypi",
+ "version": "==2.4.4"
+ },
+ "six": {
+ "hashes": [
+ "sha256:236bdbdce46e6e6a3d61a337c0f8b763ca1e8717c03b369e87a7ec7ce1319c0a",
+ "sha256:8f3cd2e254d8f793e7f3d6d9df77b92252b52637291d0f0da013c76ea2724b6c"
+ ],
+ "version": "==1.14.0"
+ },
+ "typed-ast": {
+ "hashes": [
+ "sha256:0666aa36131496aed8f7be0410ff974562ab7eeac11ef351def9ea6fa28f6355",
+ "sha256:0c2c07682d61a629b68433afb159376e24e5b2fd4641d35424e462169c0a7919",
+ "sha256:249862707802d40f7f29f6e1aad8d84b5aa9e44552d2cc17384b209f091276aa",
+ "sha256:24995c843eb0ad11a4527b026b4dde3da70e1f2d8806c99b7b4a7cf491612652",
+ "sha256:269151951236b0f9a6f04015a9004084a5ab0d5f19b57de779f908621e7d8b75",
+ "sha256:4083861b0aa07990b619bd7ddc365eb7fa4b817e99cf5f8d9cf21a42780f6e01",
+ "sha256:498b0f36cc7054c1fead3d7fc59d2150f4d5c6c56ba7fb150c013fbc683a8d2d",
+ "sha256:4e3e5da80ccbebfff202a67bf900d081906c358ccc3d5e3c8aea42fdfdfd51c1",
+ "sha256:6daac9731f172c2a22ade6ed0c00197ee7cc1221aa84cfdf9c31defeb059a907",
+ "sha256:715ff2f2df46121071622063fc7543d9b1fd19ebfc4f5c8895af64a77a8c852c",
+ "sha256:73d785a950fc82dd2a25897d525d003f6378d1cb23ab305578394694202a58c3",
+ "sha256:8c8aaad94455178e3187ab22c8b01a3837f8ee50e09cf31f1ba129eb293ec30b",
+ "sha256:8ce678dbaf790dbdb3eba24056d5364fb45944f33553dd5869b7580cdbb83614",
+ "sha256:aaee9905aee35ba5905cfb3c62f3e83b3bec7b39413f0a7f19be4e547ea01ebb",
+ "sha256:bcd3b13b56ea479b3650b82cabd6b5343a625b0ced5429e4ccad28a8973f301b",
+ "sha256:c9e348e02e4d2b4a8b2eedb48210430658df6951fa484e59de33ff773fbd4b41",
+ "sha256:d205b1b46085271b4e15f670058ce182bd1199e56b317bf2ec004b6a44f911f6",
+ "sha256:d43943ef777f9a1c42bf4e552ba23ac77a6351de620aa9acf64ad54933ad4d34",
+ "sha256:d5d33e9e7af3b34a40dc05f498939f0ebf187f07c385fd58d591c533ad8562fe",
+ "sha256:fc0fea399acb12edbf8a628ba8d2312f583bdbdb3335635db062fa98cf71fca4",
+ "sha256:fe460b922ec15dd205595c9b5b99e2f056fd98ae8f9f56b888e7a17dc2b757e7"
+ ],
+ "markers": "implementation_name == 'cpython' and python_version < '3.8'",
+ "version": "==1.4.1"
+ },
+ "wrapt": {
+ "hashes": [
+ "sha256:565a021fd19419476b9362b05eeaa094178de64f8361e44468f9e9d7843901e1"
+ ],
+ "version": "==1.11.2"
+ }
+ }
+}
diff --git a/module1-web-application-development-with-flask/web-app/app/models.py b/module1-web-application-development-with-flask/web-app/app/models.py
new file mode 100644
index 00000000..6cca8087
--- /dev/null
+++ b/module1-web-application-development-with-flask/web-app/app/models.py
@@ -0,0 +1,13 @@
+# Create some database models
+
+from app import db
+
+class User(db.Model):
+ id = db.Column(db.Integer, primary_key=True)
+ name = db.Column(db.String, nullable=False)
+ user_id = db.Column(db.Integer, nullable=False)
+
+class Tweet(db.Model):
+ id = db.Column(db.Integer, primary_key=True)
+ tweet = db.Column(db.String, nullable=False)
+ user_id = db.Column(db.Integer, nullable=False)
\ No newline at end of file
diff --git a/module1-web-application-development-with-flask/web-app/app/routes.py b/module1-web-application-development-with-flask/web-app/app/routes.py
new file mode 100644
index 00000000..767f667e
--- /dev/null
+++ b/module1-web-application-development-with-flask/web-app/app/routes.py
@@ -0,0 +1,30 @@
+from flask import current_app as app
+from flask import render_template, url_for, redirect, request, flash
+from .models import User, Tweet, db
+
+@app.route('/', methods = ['GET','POST'])
+def home():
+ print("yay it worked")
+ return render_template("tweets.html")
+
+@app.route('/create_tweet', methods=["POST"])
+def create_tweet():
+ name = request.form['Name']
+ id = request.form["Id"]
+ id_exist = User.query.filter_by(user_id=id).first()
+ name_id_exist = User.query.filter_by(user_id=id, name=name).first()
+
+ if id_exist:
+ if name_id_exist:
+ new_tweet = Tweet(tweet=request.form['Tweet'], user_id=request.form["Id"])
+ db.session.add(new_tweet)
+ else:
+ flash("This name does not match the Id!")
+ else:
+ new_user = User(name=request.form['Name'], user_id=request.form["Id"])
+ new_tweet = Tweet(tweet=request.form['Tweet'], user_id=request.form["Id"])
+ db.session.add(new_user)
+ db.session.add(new_tweet)
+
+ db.session.commit()
+ return redirect('/')
\ No newline at end of file
diff --git a/module1-web-application-development-with-flask/web-app/app/templates/tweets.html b/module1-web-application-development-with-flask/web-app/app/templates/tweets.html
new file mode 100644
index 00000000..1dc1f48d
--- /dev/null
+++ b/module1-web-application-development-with-flask/web-app/app/templates/tweets.html
@@ -0,0 +1,25 @@
+
+
+
+
+
+ Tweets
+
+
+ This is a test
+
+ {% with message = get_flashed_messages() %}
+ {% if message %}
+ {message}
+ {% endif %}
+ {% endwith %}
+
+
\ No newline at end of file
diff --git a/module2-consuming-data-from-an-api/web-app/Pipfile.lock b/module2-consuming-data-from-an-api/web-app/Pipfile.lock
new file mode 100644
index 00000000..daef59ec
--- /dev/null
+++ b/module2-consuming-data-from-an-api/web-app/Pipfile.lock
@@ -0,0 +1,320 @@
+{
+ "_meta": {
+ "hash": {
+ "sha256": "74b88441425da847cfecb71a731ae8477a71ab9b1146bf5b11150b3d9eece7b3"
+ },
+ "pipfile-spec": 6,
+ "requires": {
+ "python_version": "3.7"
+ },
+ "sources": [
+ {
+ "name": "pypi",
+ "url": "https://pypi.org/simple",
+ "verify_ssl": true
+ }
+ ]
+ },
+ "default": {
+ "basilica": {
+ "hashes": [
+ "sha256:10d111538e7fee4ece43b9a2f0f33c8b6a34dc1a061e44c035b53ac4297e3a4d"
+ ],
+ "index": "pypi",
+ "version": "==0.2.8"
+ },
+ "certifi": {
+ "hashes": [
+ "sha256:017c25db2a153ce562900032d5bc68e9f191e44e9a0f762f373977de9df1fbb3",
+ "sha256:25b64c7da4cd7479594d035c08c2d809eb4aab3a26e5a990ea98cc450c320f1f"
+ ],
+ "version": "==2019.11.28"
+ },
+ "chardet": {
+ "hashes": [
+ "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae",
+ "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"
+ ],
+ "version": "==3.0.4"
+ },
+ "click": {
+ "hashes": [
+ "sha256:8a18b4ea89d8820c5d0c7da8a64b2c324b4dabb695804dbfea19b9be9d88c0cc",
+ "sha256:e345d143d80bf5ee7534056164e5e112ea5e22716bbb1ce727941f4c8b471b9a"
+ ],
+ "version": "==7.1.1"
+ },
+ "flask": {
+ "hashes": [
+ "sha256:13f9f196f330c7c2c5d7a5cf91af894110ca0215ac051b5844701f2bfd934d52",
+ "sha256:45eb5a6fd193d6cf7e0cf5d8a5b31f83d5faae0293695626f539a823e93b13f6"
+ ],
+ "index": "pypi",
+ "version": "==1.1.1"
+ },
+ "flask-sqlalchemy": {
+ "hashes": [
+ "sha256:0078d8663330dc05a74bc72b3b6ddc441b9a744e2f56fe60af1a5bfc81334327",
+ "sha256:6974785d913666587949f7c2946f7001e4fa2cb2d19f4e69ead02e4b8f50b33d"
+ ],
+ "index": "pypi",
+ "version": "==2.4.1"
+ },
+ "idna": {
+ "hashes": [
+ "sha256:7588d1c14ae4c77d74036e8c22ff447b26d0fde8f007354fd48a7814db15b7cb",
+ "sha256:a068a21ceac8a4d63dbfd964670474107f541babbd2250d61922f029858365fa"
+ ],
+ "version": "==2.9"
+ },
+ "itsdangerous": {
+ "hashes": [
+ "sha256:321b033d07f2a4136d3ec762eac9f16a10ccd60f53c0c91af90217ace7ba1f19",
+ "sha256:b12271b2047cb23eeb98c8b5622e2e5c5e9abd9784a153e9d8ef9cb4dd09d749"
+ ],
+ "version": "==1.1.0"
+ },
+ "jinja2": {
+ "hashes": [
+ "sha256:93187ffbc7808079673ef52771baa950426fd664d3aad1d0fa3e95644360e250",
+ "sha256:b0eaf100007721b5c16c1fc1eecb87409464edc10469ddc9a22a27a99123be49"
+ ],
+ "version": "==2.11.1"
+ },
+ "markupsafe": {
+ "hashes": [
+ "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473",
+ "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161",
+ "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235",
+ "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5",
+ "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42",
+ "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff",
+ "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b",
+ "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1",
+ "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e",
+ "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183",
+ "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66",
+ "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b",
+ "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1",
+ "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15",
+ "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1",
+ "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e",
+ "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b",
+ "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905",
+ "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735",
+ "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d",
+ "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e",
+ "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d",
+ "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c",
+ "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21",
+ "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2",
+ "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5",
+ "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b",
+ "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6",
+ "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f",
+ "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f",
+ "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2",
+ "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7",
+ "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"
+ ],
+ "version": "==1.1.1"
+ },
+ "oauthlib": {
+ "hashes": [
+ "sha256:bee41cc35fcca6e988463cacc3bcb8a96224f470ca547e697b604cc697b2f889",
+ "sha256:df884cd6cbe20e32633f1db1072e9356f53638e4361bef4e8b03c9127c9328ea"
+ ],
+ "version": "==3.1.0"
+ },
+ "pillow": {
+ "hashes": [
+ "sha256:0a628977ac2e01ca96aaae247ec2bd38e729631ddf2221b4b715446fd45505be",
+ "sha256:4d9ed9a64095e031435af120d3c910148067087541131e82b3e8db302f4c8946",
+ "sha256:54ebae163e8412aff0b9df1e88adab65788f5f5b58e625dc5c7f51eaf14a6837",
+ "sha256:5bfef0b1cdde9f33881c913af14e43db69815c7e8df429ceda4c70a5e529210f",
+ "sha256:5f3546ceb08089cedb9e8ff7e3f6a7042bb5b37c2a95d392fb027c3e53a2da00",
+ "sha256:5f7ae9126d16194f114435ebb79cc536b5682002a4fa57fa7bb2cbcde65f2f4d",
+ "sha256:62a889aeb0a79e50ecf5af272e9e3c164148f4bd9636cc6bcfa182a52c8b0533",
+ "sha256:7406f5a9b2fd966e79e6abdaf700585a4522e98d6559ce37fc52e5c955fade0a",
+ "sha256:8453f914f4e5a3d828281a6628cf517832abfa13ff50679a4848926dac7c0358",
+ "sha256:87269cc6ce1e3dee11f23fa515e4249ae678dbbe2704598a51cee76c52e19cda",
+ "sha256:875358310ed7abd5320f21dd97351d62de4929b0426cdb1eaa904b64ac36b435",
+ "sha256:8ac6ce7ff3892e5deaab7abaec763538ffd011f74dc1801d93d3c5fc541feee2",
+ "sha256:91b710e3353aea6fc758cdb7136d9bbdcb26b53cefe43e2cba953ac3ee1d3313",
+ "sha256:9d2ba4ed13af381233e2d810ff3bab84ef9f18430a9b336ab69eaf3cd24299ff",
+ "sha256:a62ec5e13e227399be73303ff301f2865bf68657d15ea50b038d25fc41097317",
+ "sha256:ab76e5580b0ed647a8d8d2d2daee170e8e9f8aad225ede314f684e297e3643c2",
+ "sha256:bf4003aa538af3f4205c5fac56eacaa67a6dd81e454ffd9e9f055fff9f1bc614",
+ "sha256:bf598d2e37cf8edb1a2f26ed3fb255191f5232badea4003c16301cb94ac5bdd0",
+ "sha256:c18f70dc27cc5d236f10e7834236aff60aadc71346a5bc1f4f83a4b3abee6386",
+ "sha256:c5ed816632204a2fc9486d784d8e0d0ae754347aba99c811458d69fcdfd2a2f9",
+ "sha256:dc058b7833184970d1248135b8b0ab702e6daa833be14035179f2acb78ff5636",
+ "sha256:ff3797f2f16bf9d17d53257612da84dd0758db33935777149b3334c01ff68865"
+ ],
+ "version": "==7.0.0"
+ },
+ "pysocks": {
+ "hashes": [
+ "sha256:08e69f092cc6dbe92a0fdd16eeb9b9ffbc13cadfe5ca4c7bd92ffb078b293299",
+ "sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5",
+ "sha256:3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0"
+ ],
+ "version": "==1.7.1"
+ },
+ "python-dotenv": {
+ "hashes": [
+ "sha256:81822227f771e0cab235a2939f0f265954ac4763cafd806d845801c863bf372f",
+ "sha256:92b3123fb2d58a284f76cc92bfe4ee6c502c32ded73e8b051c4f6afc8b6751ed"
+ ],
+ "index": "pypi",
+ "version": "==0.12.0"
+ },
+ "requests": {
+ "hashes": [
+ "sha256:43999036bfa82904b6af1d99e4882b560e5e2c68e5c4b0aa03b655f3d7d73fee",
+ "sha256:b3f43d496c6daba4493e7c431722aeb7dbc6288f52a6e04e7b6023b0247817e6"
+ ],
+ "index": "pypi",
+ "version": "==2.23.0"
+ },
+ "requests-oauthlib": {
+ "hashes": [
+ "sha256:7f71572defaecd16372f9006f33c2ec8c077c3cfa6f5911a9a90202beb513f3d",
+ "sha256:b4261601a71fd721a8bd6d7aa1cc1d6a8a93b4a9f5e96626f8e4d91e8beeaa6a"
+ ],
+ "version": "==1.3.0"
+ },
+ "six": {
+ "hashes": [
+ "sha256:236bdbdce46e6e6a3d61a337c0f8b763ca1e8717c03b369e87a7ec7ce1319c0a",
+ "sha256:8f3cd2e254d8f793e7f3d6d9df77b92252b52637291d0f0da013c76ea2724b6c"
+ ],
+ "version": "==1.14.0"
+ },
+ "sqlalchemy": {
+ "hashes": [
+ "sha256:c4cca4aed606297afbe90d4306b49ad3a4cd36feb3f87e4bfd655c57fd9ef445"
+ ],
+ "version": "==1.3.15"
+ },
+ "tweepy": {
+ "hashes": [
+ "sha256:8abd828ba51a85a2b5bb7373715d6d3bb32d18ac624e3a4db02e4ef8ab48316b",
+ "sha256:ecc7f200c86127903017e48824efd008734814e95f3e8e9b45ce0f4120dd08db"
+ ],
+ "index": "pypi",
+ "version": "==3.8.0"
+ },
+ "urllib3": {
+ "hashes": [
+ "sha256:2f3db8b19923a873b3e5256dc9c2dedfa883e33d87c690d9c7913e1f40673cdc",
+ "sha256:87716c2d2a7121198ebcb7ce7cccf6ce5e9ba539041cfbaeecfb641dc0bf6acc"
+ ],
+ "version": "==1.25.8"
+ },
+ "werkzeug": {
+ "hashes": [
+ "sha256:169ba8a33788476292d04186ab33b01d6add475033dfc07215e6d219cc077096",
+ "sha256:6dc65cf9091cf750012f56f2cad759fa9e879f511b5ff8685e456b4e3bf90d16"
+ ],
+ "version": "==1.0.0"
+ }
+ },
+ "develop": {
+ "astroid": {
+ "hashes": [
+ "sha256:71ea07f44df9568a75d0f354c49143a4575d90645e9fead6dfb52c26a85ed13a",
+ "sha256:840947ebfa8b58f318d42301cf8c0a20fd794a33b61cc4638e28e9e61ba32f42"
+ ],
+ "version": "==2.3.3"
+ },
+ "isort": {
+ "hashes": [
+ "sha256:54da7e92468955c4fceacd0c86bd0ec997b0e1ee80d97f67c35a78b719dccab1",
+ "sha256:6e811fcb295968434526407adb8796944f1988c5b65e8139058f2014cbe100fd"
+ ],
+ "version": "==4.3.21"
+ },
+ "lazy-object-proxy": {
+ "hashes": [
+ "sha256:0c4b206227a8097f05c4dbdd323c50edf81f15db3b8dc064d08c62d37e1a504d",
+ "sha256:194d092e6f246b906e8f70884e620e459fc54db3259e60cf69a4d66c3fda3449",
+ "sha256:1be7e4c9f96948003609aa6c974ae59830a6baecc5376c25c92d7d697e684c08",
+ "sha256:4677f594e474c91da97f489fea5b7daa17b5517190899cf213697e48d3902f5a",
+ "sha256:48dab84ebd4831077b150572aec802f303117c8cc5c871e182447281ebf3ac50",
+ "sha256:5541cada25cd173702dbd99f8e22434105456314462326f06dba3e180f203dfd",
+ "sha256:59f79fef100b09564bc2df42ea2d8d21a64fdcda64979c0fa3db7bdaabaf6239",
+ "sha256:8d859b89baf8ef7f8bc6b00aa20316483d67f0b1cbf422f5b4dc56701c8f2ffb",
+ "sha256:9254f4358b9b541e3441b007a0ea0764b9d056afdeafc1a5569eee1cc6c1b9ea",
+ "sha256:9651375199045a358eb6741df3e02a651e0330be090b3bc79f6d0de31a80ec3e",
+ "sha256:97bb5884f6f1cdce0099f86b907aa41c970c3c672ac8b9c8352789e103cf3156",
+ "sha256:9b15f3f4c0f35727d3a0fba4b770b3c4ebbb1fa907dbcc046a1d2799f3edd142",
+ "sha256:a2238e9d1bb71a56cd710611a1614d1194dc10a175c1e08d75e1a7bcc250d442",
+ "sha256:a6ae12d08c0bf9909ce12385803a543bfe99b95fe01e752536a60af2b7797c62",
+ "sha256:ca0a928a3ddbc5725be2dd1cf895ec0a254798915fb3a36af0964a0a4149e3db",
+ "sha256:cb2c7c57005a6804ab66f106ceb8482da55f5314b7fcb06551db1edae4ad1531",
+ "sha256:d74bb8693bf9cf75ac3b47a54d716bbb1a92648d5f781fc799347cfc95952383",
+ "sha256:d945239a5639b3ff35b70a88c5f2f491913eb94871780ebfabb2568bd58afc5a",
+ "sha256:eba7011090323c1dadf18b3b689845fd96a61ba0a1dfbd7f24b921398affc357",
+ "sha256:efa1909120ce98bbb3777e8b6f92237f5d5c8ea6758efea36a473e1d38f7d3e4",
+ "sha256:f3900e8a5de27447acbf900b4750b0ddfd7ec1ea7fbaf11dfa911141bc522af0"
+ ],
+ "version": "==1.4.3"
+ },
+ "mccabe": {
+ "hashes": [
+ "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42",
+ "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"
+ ],
+ "version": "==0.6.1"
+ },
+ "pylint": {
+ "hashes": [
+ "sha256:3db5468ad013380e987410a8d6956226963aed94ecb5f9d3a28acca6d9ac36cd",
+ "sha256:886e6afc935ea2590b462664b161ca9a5e40168ea99e5300935f6591ad467df4"
+ ],
+ "index": "pypi",
+ "version": "==2.4.4"
+ },
+ "six": {
+ "hashes": [
+ "sha256:236bdbdce46e6e6a3d61a337c0f8b763ca1e8717c03b369e87a7ec7ce1319c0a",
+ "sha256:8f3cd2e254d8f793e7f3d6d9df77b92252b52637291d0f0da013c76ea2724b6c"
+ ],
+ "version": "==1.14.0"
+ },
+ "typed-ast": {
+ "hashes": [
+ "sha256:0666aa36131496aed8f7be0410ff974562ab7eeac11ef351def9ea6fa28f6355",
+ "sha256:0c2c07682d61a629b68433afb159376e24e5b2fd4641d35424e462169c0a7919",
+ "sha256:249862707802d40f7f29f6e1aad8d84b5aa9e44552d2cc17384b209f091276aa",
+ "sha256:24995c843eb0ad11a4527b026b4dde3da70e1f2d8806c99b7b4a7cf491612652",
+ "sha256:269151951236b0f9a6f04015a9004084a5ab0d5f19b57de779f908621e7d8b75",
+ "sha256:4083861b0aa07990b619bd7ddc365eb7fa4b817e99cf5f8d9cf21a42780f6e01",
+ "sha256:498b0f36cc7054c1fead3d7fc59d2150f4d5c6c56ba7fb150c013fbc683a8d2d",
+ "sha256:4e3e5da80ccbebfff202a67bf900d081906c358ccc3d5e3c8aea42fdfdfd51c1",
+ "sha256:6daac9731f172c2a22ade6ed0c00197ee7cc1221aa84cfdf9c31defeb059a907",
+ "sha256:715ff2f2df46121071622063fc7543d9b1fd19ebfc4f5c8895af64a77a8c852c",
+ "sha256:73d785a950fc82dd2a25897d525d003f6378d1cb23ab305578394694202a58c3",
+ "sha256:8c8aaad94455178e3187ab22c8b01a3837f8ee50e09cf31f1ba129eb293ec30b",
+ "sha256:8ce678dbaf790dbdb3eba24056d5364fb45944f33553dd5869b7580cdbb83614",
+ "sha256:aaee9905aee35ba5905cfb3c62f3e83b3bec7b39413f0a7f19be4e547ea01ebb",
+ "sha256:bcd3b13b56ea479b3650b82cabd6b5343a625b0ced5429e4ccad28a8973f301b",
+ "sha256:c9e348e02e4d2b4a8b2eedb48210430658df6951fa484e59de33ff773fbd4b41",
+ "sha256:d205b1b46085271b4e15f670058ce182bd1199e56b317bf2ec004b6a44f911f6",
+ "sha256:d43943ef777f9a1c42bf4e552ba23ac77a6351de620aa9acf64ad54933ad4d34",
+ "sha256:d5d33e9e7af3b34a40dc05f498939f0ebf187f07c385fd58d591c533ad8562fe",
+ "sha256:fc0fea399acb12edbf8a628ba8d2312f583bdbdb3335635db062fa98cf71fca4",
+ "sha256:fe460b922ec15dd205595c9b5b99e2f056fd98ae8f9f56b888e7a17dc2b757e7"
+ ],
+ "markers": "implementation_name == 'cpython' and python_version < '3.8'",
+ "version": "==1.4.1"
+ },
+ "wrapt": {
+ "hashes": [
+ "sha256:565a021fd19419476b9362b05eeaa094178de64f8361e44468f9e9d7843901e1"
+ ],
+ "version": "==1.11.2"
+ }
+ }
+}
diff --git a/module2-consuming-data-from-an-api/web-app/app/Services/basilica_service.py b/module2-consuming-data-from-an-api/web-app/app/Services/basilica_service.py
new file mode 100644
index 00000000..8872e477
--- /dev/null
+++ b/module2-consuming-data-from-an-api/web-app/app/Services/basilica_service.py
@@ -0,0 +1,21 @@
+import basilica
+import os
+from dotenv import load_dotenv
+
+load_dotenv()
+
+API_KEY = os.getenv("BASILICA_API_KEY")
+def basilica_api_client():
+ connection = basilica.Connection(API_KEY)
+ return connection
+
+if __name__ == "__main__":
+ connection = basilica.Connection(API_KEY)
+
+ sentences = ["Hello world!", "How are you?"]
+
+ print(sentences)
+
+ embeddings = connection.embed_sentences(sentences)
+
+ print(list(embeddings)) # [[0.8556405305862427, ...], ...]
\ No newline at end of file
diff --git a/module2-consuming-data-from-an-api/web-app/app/Services/stock_service.py b/module2-consuming-data-from-an-api/web-app/app/Services/stock_service.py
new file mode 100644
index 00000000..1323ea34
--- /dev/null
+++ b/module2-consuming-data-from-an-api/web-app/app/Services/stock_service.py
@@ -0,0 +1,19 @@
+import requests
+import json
+import os
+from dotenv import load_dotenv
+
+load_dotenv()
+
+API_KEY = os.getenv("ALPHAVANTAGE_API_KEY")
+
+request_url = f"https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=TSLA&apikey={API_KEY}"
+print(request_url)
+response = requests.get(request_url)
+print(type(response)) #>
+print(response.status_code) #> 200
+print(type(response.text)) #>
+parsed_response = json.loads(response.text)
+print(type(parsed_response)) #>
+latest_close = parsed_response["Time Series (Daily)"]["2020-02-25"]["4. close"]
+print("LATEST CLOSING PRICE:", latest_close)
\ No newline at end of file
diff --git a/module2-consuming-data-from-an-api/web-app/app/Services/twitter_service.py b/module2-consuming-data-from-an-api/web-app/app/Services/twitter_service.py
new file mode 100644
index 00000000..7b0121d3
--- /dev/null
+++ b/module2-consuming-data-from-an-api/web-app/app/Services/twitter_service.py
@@ -0,0 +1,49 @@
+import os
+from dotenv import load_dotenv
+import tweepy
+from pprint import pprint
+
+load_dotenv()
+
+consumer_key = os.getenv("TWITTER_API_KEY", default="OOPS")
+consumer_secret = os.getenv("TWITTER_API_SECRET", default="OOPS")
+access_token = os.getenv("TWITTER_ACCESS_TOKEN", default="OOPS")
+access_token_secret = os.getenv("TWITTER_ACCESS_TOKEN_SECRET", default="OOPS")
+
+def twitter_api_client():
+ auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
+ auth.set_access_token(access_token, access_token_secret)
+# print("AUTH", type(auth))
+ api = tweepy.API(auth)
+ return api
+# print("API", type(api)) #>
+
+#breakpoint()
+#public_tweets = api.home_timeline()
+#for tweet in public_tweets:
+# print(tweet.text)
+# get information about a twitter user:
+
+if __name__ == "__main__":
+ api = twitter_api_client()
+ screen_name = "elonmusk"
+ print("--------------")
+
+ print("USER...")
+ user = api.get_user(screen_name)
+ print(type(user)) #>
+ print(user.screen_name)
+ print(user.followers_count)
+ pprint(user._json)
+ print("--------------")
+
+ print("STATUSES...")
+ # get that user's tweets:
+ # see: http://docs.tweepy.org/en/latest/api.html#API.user_timeline
+ statuses = api.user_timeline(screen_name, tweet_mode="extended", count=150, exclude_replies=True, include_rts=False)
+
+ for status in statuses:
+ print(type(status)) #>
+ #pprint(status._json)
+ #breakpoint()
+ print(status.full_text)
\ No newline at end of file
diff --git a/module2-consuming-data-from-an-api/web-app/app/models.py b/module2-consuming-data-from-an-api/web-app/app/models.py
new file mode 100644
index 00000000..31e5a478
--- /dev/null
+++ b/module2-consuming-data-from-an-api/web-app/app/models.py
@@ -0,0 +1,27 @@
+# Create some database models
+
+from app import db
+
+class User(db.Model):
+ id = db.Column(db.Integer, primary_key=True)
+ name = db.Column(db.String, nullable=False)
+ user_id = db.Column(db.Integer, nullable=False)
+
+class Tweet(db.Model):
+ id = db.Column(db.Integer, primary_key=True)
+ tweet = db.Column(db.String, nullable=False)
+ user_id = db.Column(db.Integer, nullable=False)
+
+class T_User(db.Model):
+ id = db.Column(db.BigInteger, primary_key=True)
+ screen_name = db.Column(db.String(128), nullable=False)
+ name = db.Column(db.String)
+ location = db.Column(db.String)
+ followers_count = db.Column(db.Integer)
+ latest_tweet_id = db.Column(db.BigInteger)
+
+class T_Tweet(db.Model):
+ id = db.Column(db.BigInteger, primary_key=True)
+ user_id = db.Column(db.BigInteger) # , db.ForeignKey("T_User.id")
+ full_text = db.Column (db.String(500))
+ embedding = db.Column(db.PickleType)
\ No newline at end of file
diff --git a/module2-consuming-data-from-an-api/web-app/app/routes.py b/module2-consuming-data-from-an-api/web-app/app/routes.py
new file mode 100644
index 00000000..c8ea5479
--- /dev/null
+++ b/module2-consuming-data-from-an-api/web-app/app/routes.py
@@ -0,0 +1,90 @@
+from flask import current_app as app
+from flask import render_template, url_for, redirect, request, flash, make_response
+from .models import User, Tweet, db, T_User, T_Tweet
+from app.Services.twitter_service import twitter_api_client
+from app.Services.basilica_service import basilica_api_client
+
+@app.route('/', methods = ['GET','POST'])
+def home():
+ print("yay it worked")
+ return render_template("tweets.html")
+
+@app.route('/create_tweet', methods=["POST"])
+def create_tweet():
+ name = request.form['Name']
+ id = request.form["Id"]
+ id_exist = User.query.filter_by(user_id=id).first()
+ name_id_exist = User.query.filter_by(user_id=id, name=name).first()
+
+ if id_exist:
+ if name_id_exist:
+ new_tweet = Tweet(tweet=request.form['Tweet'], user_id=request.form["Id"])
+ db.session.add(new_tweet)
+ else:
+ return make_response("The name does not match the Id!")
+ else:
+ new_user = User(name=request.form['Name'], user_id=request.form["Id"])
+ new_tweet = Tweet(tweet=request.form['Tweet'], user_id=request.form["Id"])
+ db.session.add(new_user)
+ db.session.add(new_tweet)
+
+ db.session.commit()
+ return redirect('/')
+
+@app.route('/display_users', methods = ['GET'])
+def display_users():
+ users = User.query.all()
+ return render_template("our_users.html", users=users)
+
+
+@app.route('/')
+def get_user(screen_name=None):
+ # Instansiate twitter api class
+ api = twitter_api_client()
+ # grab username from url and create the api.get_user object
+ twitter_user = api.get_user(screen_name)
+ # Grab all the tweets from the username in the url
+ statuses = api.user_timeline(screen_name, tweet_mode="extended", count=150, exclude_replies=True, include_rts=False)
+ # Create a Twitter Username object if one doesn't exist already in the db
+ db_user = T_User.query.get(twitter_user.id) or T_User(id=twitter_user.id)
+ # Insert twitter screen name
+ db_user.screen_name = twitter_user.screen_name
+ # Insert twitter user name
+ db_user.name = twitter_user.name
+ # Insert twitter user location
+ db_user.location = twitter_user.location
+ # Insert twitter user follower count
+ db_user.followers_count = twitter_user.followers_count
+ # Add Twitter User Object into the db
+ db.session.add(db_user)
+ # Commit the changes onto the db
+ db.session.commit()
+ # Instansiate basilica api class
+ basilica_api = basilica_api_client()
+ # List comprehension that grabs all the tweets from status and puts it into full_text format
+ all_tweets = [status.full_text for status in statuses]
+ # Creates a list of all embedding values for each tweet in alL_tweets
+ embeddings = list(basilica_api.embed_sentences(all_tweets, model="twitter"))
+ # Iterate through each status in statuses
+
+ # Create counter variable
+ counter = 0
+ for status in statuses:
+ # create user twitter tweets object from the T_Tweet class if the id doesn't already exist in the db
+ db_tweet = T_Tweet.query.get(status.id) or T_Tweet(id=status.id)
+ # inserts the twitter user id as the tweet user id
+ db_tweet.user_id = db_user.id
+ # inserts the full tweet from the twitter user
+ db_tweet.full_text = status.full_text
+ # creates a variable that holds a single embedding value from a single tweet
+ embedding = embeddings[counter]
+ # inserts the embedding value from the user's tweet
+ db_tweet.embedding = embedding
+ # Add the changes to the db
+ db.session.add(db_tweet)
+ # Increase the counter by one to iterate through each tweet from the list
+ counter+=1
+ # commit changes
+ db.session.commit()
+ # Return string if everything worked properly
+ return "User has been added to the data base!... hopefully..."
\ No newline at end of file
diff --git a/module2-consuming-data-from-an-api/web-app/app/templates/our_users.html b/module2-consuming-data-from-an-api/web-app/app/templates/our_users.html
new file mode 100644
index 00000000..fdd4b9bd
--- /dev/null
+++ b/module2-consuming-data-from-an-api/web-app/app/templates/our_users.html
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+ {% if users %}
+ {% for user in users %}
+ {{user['name']}}
+ {% endfor %}
+ {% else %}
+ There are no users in our database
+ {% endif %}
+
+
\ No newline at end of file
diff --git a/module2-consuming-data-from-an-api/web-app/app/templates/tweets.html b/module2-consuming-data-from-an-api/web-app/app/templates/tweets.html
new file mode 100644
index 00000000..84c299c5
--- /dev/null
+++ b/module2-consuming-data-from-an-api/web-app/app/templates/tweets.html
@@ -0,0 +1,20 @@
+
+
+
+
+
+ Tweets
+
+
+ This is a test
+
+
+
\ No newline at end of file
diff --git a/module3-adding-data-science-to-a-web-application/web-app/Pipfile.lock b/module3-adding-data-science-to-a-web-application/web-app/Pipfile.lock
new file mode 100644
index 00000000..edc8aa1a
--- /dev/null
+++ b/module3-adding-data-science-to-a-web-application/web-app/Pipfile.lock
@@ -0,0 +1,406 @@
+{
+ "_meta": {
+ "hash": {
+ "sha256": "6924d39ae5dd034d4b96063cff7caff19e75f19014556cc081ae9b0200be3d2b"
+ },
+ "pipfile-spec": 6,
+ "requires": {
+ "python_version": "3.7"
+ },
+ "sources": [
+ {
+ "name": "pypi",
+ "url": "https://pypi.org/simple",
+ "verify_ssl": true
+ }
+ ]
+ },
+ "default": {
+ "basilica": {
+ "hashes": [
+ "sha256:10d111538e7fee4ece43b9a2f0f33c8b6a34dc1a061e44c035b53ac4297e3a4d"
+ ],
+ "index": "pypi",
+ "version": "==0.2.8"
+ },
+ "certifi": {
+ "hashes": [
+ "sha256:017c25db2a153ce562900032d5bc68e9f191e44e9a0f762f373977de9df1fbb3",
+ "sha256:25b64c7da4cd7479594d035c08c2d809eb4aab3a26e5a990ea98cc450c320f1f"
+ ],
+ "version": "==2019.11.28"
+ },
+ "chardet": {
+ "hashes": [
+ "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae",
+ "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"
+ ],
+ "version": "==3.0.4"
+ },
+ "click": {
+ "hashes": [
+ "sha256:8a18b4ea89d8820c5d0c7da8a64b2c324b4dabb695804dbfea19b9be9d88c0cc",
+ "sha256:e345d143d80bf5ee7534056164e5e112ea5e22716bbb1ce727941f4c8b471b9a"
+ ],
+ "version": "==7.1.1"
+ },
+ "flask": {
+ "hashes": [
+ "sha256:13f9f196f330c7c2c5d7a5cf91af894110ca0215ac051b5844701f2bfd934d52",
+ "sha256:45eb5a6fd193d6cf7e0cf5d8a5b31f83d5faae0293695626f539a823e93b13f6"
+ ],
+ "index": "pypi",
+ "version": "==1.1.1"
+ },
+ "flask-sqlalchemy": {
+ "hashes": [
+ "sha256:0078d8663330dc05a74bc72b3b6ddc441b9a744e2f56fe60af1a5bfc81334327",
+ "sha256:6974785d913666587949f7c2946f7001e4fa2cb2d19f4e69ead02e4b8f50b33d"
+ ],
+ "index": "pypi",
+ "version": "==2.4.1"
+ },
+ "idna": {
+ "hashes": [
+ "sha256:7588d1c14ae4c77d74036e8c22ff447b26d0fde8f007354fd48a7814db15b7cb",
+ "sha256:a068a21ceac8a4d63dbfd964670474107f541babbd2250d61922f029858365fa"
+ ],
+ "version": "==2.9"
+ },
+ "itsdangerous": {
+ "hashes": [
+ "sha256:321b033d07f2a4136d3ec762eac9f16a10ccd60f53c0c91af90217ace7ba1f19",
+ "sha256:b12271b2047cb23eeb98c8b5622e2e5c5e9abd9784a153e9d8ef9cb4dd09d749"
+ ],
+ "version": "==1.1.0"
+ },
+ "jinja2": {
+ "hashes": [
+ "sha256:93187ffbc7808079673ef52771baa950426fd664d3aad1d0fa3e95644360e250",
+ "sha256:b0eaf100007721b5c16c1fc1eecb87409464edc10469ddc9a22a27a99123be49"
+ ],
+ "version": "==2.11.1"
+ },
+ "joblib": {
+ "hashes": [
+ "sha256:0630eea4f5664c463f23fbf5dcfc54a2bc6168902719fa8e19daf033022786c8",
+ "sha256:bdb4fd9b72915ffb49fde2229ce482dd7ae79d842ed8c2b4c932441495af1403"
+ ],
+ "version": "==0.14.1"
+ },
+ "markupsafe": {
+ "hashes": [
+ "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473",
+ "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161",
+ "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235",
+ "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5",
+ "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42",
+ "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff",
+ "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b",
+ "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1",
+ "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e",
+ "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183",
+ "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66",
+ "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b",
+ "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1",
+ "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15",
+ "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1",
+ "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e",
+ "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b",
+ "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905",
+ "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735",
+ "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d",
+ "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e",
+ "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d",
+ "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c",
+ "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21",
+ "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2",
+ "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5",
+ "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b",
+ "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6",
+ "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f",
+ "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f",
+ "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2",
+ "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7",
+ "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"
+ ],
+ "version": "==1.1.1"
+ },
+ "numpy": {
+ "hashes": [
+ "sha256:1598a6de323508cfeed6b7cd6c4efb43324f4692e20d1f76e1feec7f59013448",
+ "sha256:1b0ece94018ae21163d1f651b527156e1f03943b986188dd81bc7e066eae9d1c",
+ "sha256:2e40be731ad618cb4974d5ba60d373cdf4f1b8dcbf1dcf4d9dff5e212baf69c5",
+ "sha256:4ba59db1fcc27ea31368af524dcf874d9277f21fd2e1f7f1e2e0c75ee61419ed",
+ "sha256:59ca9c6592da581a03d42cc4e270732552243dc45e87248aa8d636d53812f6a5",
+ "sha256:5e0feb76849ca3e83dd396254e47c7dba65b3fa9ed3df67c2556293ae3e16de3",
+ "sha256:6d205249a0293e62bbb3898c4c2e1ff8a22f98375a34775a259a0523111a8f6c",
+ "sha256:6fcc5a3990e269f86d388f165a089259893851437b904f422d301cdce4ff25c8",
+ "sha256:82847f2765835c8e5308f136bc34018d09b49037ec23ecc42b246424c767056b",
+ "sha256:87902e5c03355335fc5992a74ba0247a70d937f326d852fc613b7f53516c0963",
+ "sha256:9ab21d1cb156a620d3999dd92f7d1c86824c622873841d6b080ca5495fa10fef",
+ "sha256:a1baa1dc8ecd88fb2d2a651671a84b9938461e8a8eed13e2f0a812a94084d1fa",
+ "sha256:a244f7af80dacf21054386539699ce29bcc64796ed9850c99a34b41305630286",
+ "sha256:a35af656a7ba1d3decdd4fae5322b87277de8ac98b7d9da657d9e212ece76a61",
+ "sha256:b1fe1a6f3a6f355f6c29789b5927f8bd4f134a4bd9a781099a7c4f66af8850f5",
+ "sha256:b5ad0adb51b2dee7d0ee75a69e9871e2ddfb061c73ea8bc439376298141f77f5",
+ "sha256:ba3c7a2814ec8a176bb71f91478293d633c08582119e713a0c5351c0f77698da",
+ "sha256:cd77d58fb2acf57c1d1ee2835567cd70e6f1835e32090538f17f8a3a99e5e34b",
+ "sha256:cdb3a70285e8220875e4d2bc394e49b4988bdb1298ffa4e0bd81b2f613be397c",
+ "sha256:deb529c40c3f1e38d53d5ae6cd077c21f1d49e13afc7936f7f868455e16b64a0",
+ "sha256:e7894793e6e8540dbeac77c87b489e331947813511108ae097f1715c018b8f3d"
+ ],
+ "version": "==1.18.2"
+ },
+ "oauthlib": {
+ "hashes": [
+ "sha256:bee41cc35fcca6e988463cacc3bcb8a96224f470ca547e697b604cc697b2f889",
+ "sha256:df884cd6cbe20e32633f1db1072e9356f53638e4361bef4e8b03c9127c9328ea"
+ ],
+ "version": "==3.1.0"
+ },
+ "pillow": {
+ "hashes": [
+ "sha256:0a628977ac2e01ca96aaae247ec2bd38e729631ddf2221b4b715446fd45505be",
+ "sha256:4d9ed9a64095e031435af120d3c910148067087541131e82b3e8db302f4c8946",
+ "sha256:54ebae163e8412aff0b9df1e88adab65788f5f5b58e625dc5c7f51eaf14a6837",
+ "sha256:5bfef0b1cdde9f33881c913af14e43db69815c7e8df429ceda4c70a5e529210f",
+ "sha256:5f3546ceb08089cedb9e8ff7e3f6a7042bb5b37c2a95d392fb027c3e53a2da00",
+ "sha256:5f7ae9126d16194f114435ebb79cc536b5682002a4fa57fa7bb2cbcde65f2f4d",
+ "sha256:62a889aeb0a79e50ecf5af272e9e3c164148f4bd9636cc6bcfa182a52c8b0533",
+ "sha256:7406f5a9b2fd966e79e6abdaf700585a4522e98d6559ce37fc52e5c955fade0a",
+ "sha256:8453f914f4e5a3d828281a6628cf517832abfa13ff50679a4848926dac7c0358",
+ "sha256:87269cc6ce1e3dee11f23fa515e4249ae678dbbe2704598a51cee76c52e19cda",
+ "sha256:875358310ed7abd5320f21dd97351d62de4929b0426cdb1eaa904b64ac36b435",
+ "sha256:8ac6ce7ff3892e5deaab7abaec763538ffd011f74dc1801d93d3c5fc541feee2",
+ "sha256:91b710e3353aea6fc758cdb7136d9bbdcb26b53cefe43e2cba953ac3ee1d3313",
+ "sha256:9d2ba4ed13af381233e2d810ff3bab84ef9f18430a9b336ab69eaf3cd24299ff",
+ "sha256:a62ec5e13e227399be73303ff301f2865bf68657d15ea50b038d25fc41097317",
+ "sha256:ab76e5580b0ed647a8d8d2d2daee170e8e9f8aad225ede314f684e297e3643c2",
+ "sha256:bf4003aa538af3f4205c5fac56eacaa67a6dd81e454ffd9e9f055fff9f1bc614",
+ "sha256:bf598d2e37cf8edb1a2f26ed3fb255191f5232badea4003c16301cb94ac5bdd0",
+ "sha256:c18f70dc27cc5d236f10e7834236aff60aadc71346a5bc1f4f83a4b3abee6386",
+ "sha256:c5ed816632204a2fc9486d784d8e0d0ae754347aba99c811458d69fcdfd2a2f9",
+ "sha256:dc058b7833184970d1248135b8b0ab702e6daa833be14035179f2acb78ff5636",
+ "sha256:ff3797f2f16bf9d17d53257612da84dd0758db33935777149b3334c01ff68865"
+ ],
+ "version": "==7.0.0"
+ },
+ "pysocks": {
+ "hashes": [
+ "sha256:08e69f092cc6dbe92a0fdd16eeb9b9ffbc13cadfe5ca4c7bd92ffb078b293299",
+ "sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5",
+ "sha256:3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0"
+ ],
+ "version": "==1.7.1"
+ },
+ "python-dotenv": {
+ "hashes": [
+ "sha256:81822227f771e0cab235a2939f0f265954ac4763cafd806d845801c863bf372f",
+ "sha256:92b3123fb2d58a284f76cc92bfe4ee6c502c32ded73e8b051c4f6afc8b6751ed"
+ ],
+ "index": "pypi",
+ "version": "==0.12.0"
+ },
+ "requests": {
+ "hashes": [
+ "sha256:43999036bfa82904b6af1d99e4882b560e5e2c68e5c4b0aa03b655f3d7d73fee",
+ "sha256:b3f43d496c6daba4493e7c431722aeb7dbc6288f52a6e04e7b6023b0247817e6"
+ ],
+ "index": "pypi",
+ "version": "==2.23.0"
+ },
+ "requests-oauthlib": {
+ "hashes": [
+ "sha256:7f71572defaecd16372f9006f33c2ec8c077c3cfa6f5911a9a90202beb513f3d",
+ "sha256:b4261601a71fd721a8bd6d7aa1cc1d6a8a93b4a9f5e96626f8e4d91e8beeaa6a"
+ ],
+ "version": "==1.3.0"
+ },
+ "scikit-learn": {
+ "hashes": [
+ "sha256:1bf45e62799b6938357cfce19f72e3751448c4b27010e4f98553da669b5bbd86",
+ "sha256:267ad874b54c67b479c3b45eb132ef4a56ab2b27963410624a413a4e2a3fc388",
+ "sha256:2d1bb83d6c51a81193d8a6b5f31930e2959c0e1019d49bdd03f54163735dae4b",
+ "sha256:349ba3d837fb3f7cb2b91486c43713e4b7de17f9e852f165049b1b7ac2f81478",
+ "sha256:3f4d8eea3531d3eaf613fa33f711113dfff6021d57a49c9d319af4afb46f72f0",
+ "sha256:4990f0e166292d2a0f0ee528233723bcfd238bfdb3ec2512a9e27f5695362f35",
+ "sha256:57538d138ba54407d21e27c306735cbd42a6aae0df6a5a30c7a6edde46b0017d",
+ "sha256:5b722e8bb708f254af028dc2da86d23df5371cba57e24f889b672e7b15423caa",
+ "sha256:6043e2c4ccfc68328c331b0fc19691be8fb02bd76d694704843a23ad651de902",
+ "sha256:672ea38eb59b739a8907ec063642b486bcb5a2073dda5b72b7983eeaf1fd67c1",
+ "sha256:73207dca6e70f8f611f28add185cf3a793c8232a1722f21d82259560dc35cd50",
+ "sha256:83fc104a799cb340054e485c25dfeee712b36f5638fb374eba45a9db490f16ff",
+ "sha256:8416150ab505f1813da02cdbdd9f367b05bfc75cf251235015bb09f8674358a0",
+ "sha256:84e759a766c315deb5c85139ff879edbb0aabcddb9358acf499564ed1c21e337",
+ "sha256:8ed66ab27b3d68e57bb1f315fc35e595a5c4a1f108c3420943de4d18fc40e615",
+ "sha256:a7f8aa93f61aaad080b29a9018db93ded0586692c03ddf2122e47dd1d3a14e1b",
+ "sha256:ddd3bf82977908ff69303115dd5697606e669d8a7eafd7d83bb153ef9e11bd5e",
+ "sha256:de9933297f8659ee3bb330eafdd80d74cd73d5dab39a9026b65a4156bc479063",
+ "sha256:ea91a70a992ada395efc3d510cf011dc2d99dc9037bb38cd1cb00e14745005f5",
+ "sha256:eb4c9f0019abb374a2e55150f070a333c8f990b850d1eb4dfc2765fc317ffc7c",
+ "sha256:ffce8abfdcd459e72e5b91727b247b401b22253cbd18d251f842a60e26262d6f"
+ ],
+ "index": "pypi",
+ "version": "==0.22.2.post1"
+ },
+ "scipy": {
+ "hashes": [
+ "sha256:00af72998a46c25bdb5824d2b729e7dabec0c765f9deb0b504f928591f5ff9d4",
+ "sha256:0902a620a381f101e184a958459b36d3ee50f5effd186db76e131cbefcbb96f7",
+ "sha256:1e3190466d669d658233e8a583b854f6386dd62d655539b77b3fa25bfb2abb70",
+ "sha256:2cce3f9847a1a51019e8c5b47620da93950e58ebc611f13e0d11f4980ca5fecb",
+ "sha256:3092857f36b690a321a662fe5496cb816a7f4eecd875e1d36793d92d3f884073",
+ "sha256:386086e2972ed2db17cebf88610aab7d7f6e2c0ca30042dc9a89cf18dcc363fa",
+ "sha256:71eb180f22c49066f25d6df16f8709f215723317cc951d99e54dc88020ea57be",
+ "sha256:770254a280d741dd3436919d47e35712fb081a6ff8bafc0f319382b954b77802",
+ "sha256:787cc50cab3020a865640aba3485e9fbd161d4d3b0d03a967df1a2881320512d",
+ "sha256:8a07760d5c7f3a92e440ad3aedcc98891e915ce857664282ae3c0220f3301eb6",
+ "sha256:8d3bc3993b8e4be7eade6dcc6fd59a412d96d3a33fa42b0fa45dc9e24495ede9",
+ "sha256:9508a7c628a165c2c835f2497837bf6ac80eb25291055f56c129df3c943cbaf8",
+ "sha256:a144811318853a23d32a07bc7fd5561ff0cac5da643d96ed94a4ffe967d89672",
+ "sha256:a1aae70d52d0b074d8121333bc807a485f9f1e6a69742010b33780df2e60cfe0",
+ "sha256:a2d6df9eb074af7f08866598e4ef068a2b310d98f87dc23bd1b90ec7bdcec802",
+ "sha256:bb517872058a1f087c4528e7429b4a44533a902644987e7b2fe35ecc223bc408",
+ "sha256:c5cac0c0387272ee0e789e94a570ac51deb01c796b37fb2aad1fb13f85e2f97d",
+ "sha256:cc971a82ea1170e677443108703a2ec9ff0f70752258d0e9f5433d00dda01f59",
+ "sha256:dba8306f6da99e37ea08c08fef6e274b5bf8567bb094d1dbe86a20e532aca088",
+ "sha256:dc60bb302f48acf6da8ca4444cfa17d52c63c5415302a9ee77b3b21618090521",
+ "sha256:dee1bbf3a6c8f73b6b218cb28eed8dd13347ea2f87d572ce19b289d6fd3fbc59"
+ ],
+ "version": "==1.4.1"
+ },
+ "six": {
+ "hashes": [
+ "sha256:236bdbdce46e6e6a3d61a337c0f8b763ca1e8717c03b369e87a7ec7ce1319c0a",
+ "sha256:8f3cd2e254d8f793e7f3d6d9df77b92252b52637291d0f0da013c76ea2724b6c"
+ ],
+ "version": "==1.14.0"
+ },
+ "sqlalchemy": {
+ "hashes": [
+ "sha256:c4cca4aed606297afbe90d4306b49ad3a4cd36feb3f87e4bfd655c57fd9ef445"
+ ],
+ "version": "==1.3.15"
+ },
+ "tweepy": {
+ "hashes": [
+ "sha256:8abd828ba51a85a2b5bb7373715d6d3bb32d18ac624e3a4db02e4ef8ab48316b",
+ "sha256:ecc7f200c86127903017e48824efd008734814e95f3e8e9b45ce0f4120dd08db"
+ ],
+ "index": "pypi",
+ "version": "==3.8.0"
+ },
+ "urllib3": {
+ "hashes": [
+ "sha256:2f3db8b19923a873b3e5256dc9c2dedfa883e33d87c690d9c7913e1f40673cdc",
+ "sha256:87716c2d2a7121198ebcb7ce7cccf6ce5e9ba539041cfbaeecfb641dc0bf6acc"
+ ],
+ "version": "==1.25.8"
+ },
+ "werkzeug": {
+ "hashes": [
+ "sha256:169ba8a33788476292d04186ab33b01d6add475033dfc07215e6d219cc077096",
+ "sha256:6dc65cf9091cf750012f56f2cad759fa9e879f511b5ff8685e456b4e3bf90d16"
+ ],
+ "version": "==1.0.0"
+ }
+ },
+ "develop": {
+ "astroid": {
+ "hashes": [
+ "sha256:71ea07f44df9568a75d0f354c49143a4575d90645e9fead6dfb52c26a85ed13a",
+ "sha256:840947ebfa8b58f318d42301cf8c0a20fd794a33b61cc4638e28e9e61ba32f42"
+ ],
+ "version": "==2.3.3"
+ },
+ "isort": {
+ "hashes": [
+ "sha256:54da7e92468955c4fceacd0c86bd0ec997b0e1ee80d97f67c35a78b719dccab1",
+ "sha256:6e811fcb295968434526407adb8796944f1988c5b65e8139058f2014cbe100fd"
+ ],
+ "version": "==4.3.21"
+ },
+ "lazy-object-proxy": {
+ "hashes": [
+ "sha256:0c4b206227a8097f05c4dbdd323c50edf81f15db3b8dc064d08c62d37e1a504d",
+ "sha256:194d092e6f246b906e8f70884e620e459fc54db3259e60cf69a4d66c3fda3449",
+ "sha256:1be7e4c9f96948003609aa6c974ae59830a6baecc5376c25c92d7d697e684c08",
+ "sha256:4677f594e474c91da97f489fea5b7daa17b5517190899cf213697e48d3902f5a",
+ "sha256:48dab84ebd4831077b150572aec802f303117c8cc5c871e182447281ebf3ac50",
+ "sha256:5541cada25cd173702dbd99f8e22434105456314462326f06dba3e180f203dfd",
+ "sha256:59f79fef100b09564bc2df42ea2d8d21a64fdcda64979c0fa3db7bdaabaf6239",
+ "sha256:8d859b89baf8ef7f8bc6b00aa20316483d67f0b1cbf422f5b4dc56701c8f2ffb",
+ "sha256:9254f4358b9b541e3441b007a0ea0764b9d056afdeafc1a5569eee1cc6c1b9ea",
+ "sha256:9651375199045a358eb6741df3e02a651e0330be090b3bc79f6d0de31a80ec3e",
+ "sha256:97bb5884f6f1cdce0099f86b907aa41c970c3c672ac8b9c8352789e103cf3156",
+ "sha256:9b15f3f4c0f35727d3a0fba4b770b3c4ebbb1fa907dbcc046a1d2799f3edd142",
+ "sha256:a2238e9d1bb71a56cd710611a1614d1194dc10a175c1e08d75e1a7bcc250d442",
+ "sha256:a6ae12d08c0bf9909ce12385803a543bfe99b95fe01e752536a60af2b7797c62",
+ "sha256:ca0a928a3ddbc5725be2dd1cf895ec0a254798915fb3a36af0964a0a4149e3db",
+ "sha256:cb2c7c57005a6804ab66f106ceb8482da55f5314b7fcb06551db1edae4ad1531",
+ "sha256:d74bb8693bf9cf75ac3b47a54d716bbb1a92648d5f781fc799347cfc95952383",
+ "sha256:d945239a5639b3ff35b70a88c5f2f491913eb94871780ebfabb2568bd58afc5a",
+ "sha256:eba7011090323c1dadf18b3b689845fd96a61ba0a1dfbd7f24b921398affc357",
+ "sha256:efa1909120ce98bbb3777e8b6f92237f5d5c8ea6758efea36a473e1d38f7d3e4",
+ "sha256:f3900e8a5de27447acbf900b4750b0ddfd7ec1ea7fbaf11dfa911141bc522af0"
+ ],
+ "version": "==1.4.3"
+ },
+ "mccabe": {
+ "hashes": [
+ "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42",
+ "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"
+ ],
+ "version": "==0.6.1"
+ },
+ "pylint": {
+ "hashes": [
+ "sha256:3db5468ad013380e987410a8d6956226963aed94ecb5f9d3a28acca6d9ac36cd",
+ "sha256:886e6afc935ea2590b462664b161ca9a5e40168ea99e5300935f6591ad467df4"
+ ],
+ "index": "pypi",
+ "version": "==2.4.4"
+ },
+ "six": {
+ "hashes": [
+ "sha256:236bdbdce46e6e6a3d61a337c0f8b763ca1e8717c03b369e87a7ec7ce1319c0a",
+ "sha256:8f3cd2e254d8f793e7f3d6d9df77b92252b52637291d0f0da013c76ea2724b6c"
+ ],
+ "version": "==1.14.0"
+ },
+ "typed-ast": {
+ "hashes": [
+ "sha256:0666aa36131496aed8f7be0410ff974562ab7eeac11ef351def9ea6fa28f6355",
+ "sha256:0c2c07682d61a629b68433afb159376e24e5b2fd4641d35424e462169c0a7919",
+ "sha256:249862707802d40f7f29f6e1aad8d84b5aa9e44552d2cc17384b209f091276aa",
+ "sha256:24995c843eb0ad11a4527b026b4dde3da70e1f2d8806c99b7b4a7cf491612652",
+ "sha256:269151951236b0f9a6f04015a9004084a5ab0d5f19b57de779f908621e7d8b75",
+ "sha256:4083861b0aa07990b619bd7ddc365eb7fa4b817e99cf5f8d9cf21a42780f6e01",
+ "sha256:498b0f36cc7054c1fead3d7fc59d2150f4d5c6c56ba7fb150c013fbc683a8d2d",
+ "sha256:4e3e5da80ccbebfff202a67bf900d081906c358ccc3d5e3c8aea42fdfdfd51c1",
+ "sha256:6daac9731f172c2a22ade6ed0c00197ee7cc1221aa84cfdf9c31defeb059a907",
+ "sha256:715ff2f2df46121071622063fc7543d9b1fd19ebfc4f5c8895af64a77a8c852c",
+ "sha256:73d785a950fc82dd2a25897d525d003f6378d1cb23ab305578394694202a58c3",
+ "sha256:8c8aaad94455178e3187ab22c8b01a3837f8ee50e09cf31f1ba129eb293ec30b",
+ "sha256:8ce678dbaf790dbdb3eba24056d5364fb45944f33553dd5869b7580cdbb83614",
+ "sha256:aaee9905aee35ba5905cfb3c62f3e83b3bec7b39413f0a7f19be4e547ea01ebb",
+ "sha256:bcd3b13b56ea479b3650b82cabd6b5343a625b0ced5429e4ccad28a8973f301b",
+ "sha256:c9e348e02e4d2b4a8b2eedb48210430658df6951fa484e59de33ff773fbd4b41",
+ "sha256:d205b1b46085271b4e15f670058ce182bd1199e56b317bf2ec004b6a44f911f6",
+ "sha256:d43943ef777f9a1c42bf4e552ba23ac77a6351de620aa9acf64ad54933ad4d34",
+ "sha256:d5d33e9e7af3b34a40dc05f498939f0ebf187f07c385fd58d591c533ad8562fe",
+ "sha256:fc0fea399acb12edbf8a628ba8d2312f583bdbdb3335635db062fa98cf71fca4",
+ "sha256:fe460b922ec15dd205595c9b5b99e2f056fd98ae8f9f56b888e7a17dc2b757e7"
+ ],
+ "markers": "implementation_name == 'cpython' and python_version < '3.8'",
+ "version": "==1.4.1"
+ },
+ "wrapt": {
+ "hashes": [
+ "sha256:565a021fd19419476b9362b05eeaa094178de64f8361e44468f9e9d7843901e1"
+ ],
+ "version": "==1.11.2"
+ }
+ }
+}
diff --git a/module3-adding-data-science-to-a-web-application/web-app/app/Services/basilica_service.py b/module3-adding-data-science-to-a-web-application/web-app/app/Services/basilica_service.py
new file mode 100644
index 00000000..8872e477
--- /dev/null
+++ b/module3-adding-data-science-to-a-web-application/web-app/app/Services/basilica_service.py
@@ -0,0 +1,21 @@
+import basilica
+import os
+from dotenv import load_dotenv
+
+load_dotenv()
+
+API_KEY = os.getenv("BASILICA_API_KEY")
+def basilica_api_client():
+ connection = basilica.Connection(API_KEY)
+ return connection
+
+if __name__ == "__main__":
+ connection = basilica.Connection(API_KEY)
+
+ sentences = ["Hello world!", "How are you?"]
+
+ print(sentences)
+
+ embeddings = connection.embed_sentences(sentences)
+
+ print(list(embeddings)) # [[0.8556405305862427, ...], ...]
\ No newline at end of file
diff --git a/module3-adding-data-science-to-a-web-application/web-app/app/Services/stock_service.py b/module3-adding-data-science-to-a-web-application/web-app/app/Services/stock_service.py
new file mode 100644
index 00000000..1323ea34
--- /dev/null
+++ b/module3-adding-data-science-to-a-web-application/web-app/app/Services/stock_service.py
@@ -0,0 +1,19 @@
+import requests
+import json
+import os
+from dotenv import load_dotenv
+
+load_dotenv()
+
+API_KEY = os.getenv("ALPHAVANTAGE_API_KEY")
+
+request_url = f"https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=TSLA&apikey={API_KEY}"
+print(request_url)
+response = requests.get(request_url)
+print(type(response)) #>
+print(response.status_code) #> 200
+print(type(response.text)) #>
+parsed_response = json.loads(response.text)
+print(type(parsed_response)) #>
+latest_close = parsed_response["Time Series (Daily)"]["2020-02-25"]["4. close"]
+print("LATEST CLOSING PRICE:", latest_close)
\ No newline at end of file
diff --git a/module3-adding-data-science-to-a-web-application/web-app/app/Services/twitter_service.py b/module3-adding-data-science-to-a-web-application/web-app/app/Services/twitter_service.py
new file mode 100644
index 00000000..7b0121d3
--- /dev/null
+++ b/module3-adding-data-science-to-a-web-application/web-app/app/Services/twitter_service.py
@@ -0,0 +1,49 @@
+import os
+from dotenv import load_dotenv
+import tweepy
+from pprint import pprint
+
+load_dotenv()
+
+consumer_key = os.getenv("TWITTER_API_KEY", default="OOPS")
+consumer_secret = os.getenv("TWITTER_API_SECRET", default="OOPS")
+access_token = os.getenv("TWITTER_ACCESS_TOKEN", default="OOPS")
+access_token_secret = os.getenv("TWITTER_ACCESS_TOKEN_SECRET", default="OOPS")
+
+def twitter_api_client():
+ auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
+ auth.set_access_token(access_token, access_token_secret)
+# print("AUTH", type(auth))
+ api = tweepy.API(auth)
+ return api
+# print("API", type(api)) #>
+
+#breakpoint()
+#public_tweets = api.home_timeline()
+#for tweet in public_tweets:
+# print(tweet.text)
+# get information about a twitter user:
+
+if __name__ == "__main__":
+ api = twitter_api_client()
+ screen_name = "elonmusk"
+ print("--------------")
+
+ print("USER...")
+ user = api.get_user(screen_name)
+ print(type(user)) #>
+ print(user.screen_name)
+ print(user.followers_count)
+ pprint(user._json)
+ print("--------------")
+
+ print("STATUSES...")
+ # get that user's tweets:
+ # see: http://docs.tweepy.org/en/latest/api.html#API.user_timeline
+ statuses = api.user_timeline(screen_name, tweet_mode="extended", count=150, exclude_replies=True, include_rts=False)
+
+ for status in statuses:
+ print(type(status)) #>
+ #pprint(status._json)
+ #breakpoint()
+ print(status.full_text)
\ No newline at end of file
diff --git a/module3-adding-data-science-to-a-web-application/web-app/app/models.py b/module3-adding-data-science-to-a-web-application/web-app/app/models.py
new file mode 100644
index 00000000..944dcd33
--- /dev/null
+++ b/module3-adding-data-science-to-a-web-application/web-app/app/models.py
@@ -0,0 +1,32 @@
+# Create some database models
+
+from app import db
+
+class User(db.Model):
+ id = db.Column(db.Integer, primary_key=True)
+ name = db.Column(db.String, nullable=False)
+ user_id = db.Column(db.Integer, nullable=False)
+
+class Tweet(db.Model):
+ id = db.Column(db.Integer, primary_key=True)
+ tweet = db.Column(db.String, nullable=False)
+ user_id = db.Column(db.Integer, nullable=False)
+
+class T_User(db.Model):
+
+ __tablename__ = "t_user"
+
+ id = db.Column(db.BigInteger, primary_key=True)
+ screen_name = db.Column(db.String(128), nullable=False)
+ name = db.Column(db.String)
+ location = db.Column(db.String)
+ followers_count = db.Column(db.Integer)
+ latest_tweet_id = db.Column(db.BigInteger)
+
+class T_Tweet(db.Model):
+ id = db.Column(db.BigInteger, primary_key=True)
+ user_id = db.Column(db.BigInteger, db.ForeignKey("t_user.id"))
+ full_text = db.Column (db.String(500))
+ embedding = db.Column(db.PickleType)
+
+ user = db.relationship("T_User", backref=db.backref("tweets", lazy=True))
\ No newline at end of file
diff --git a/module3-adding-data-science-to-a-web-application/web-app/app/routes.py b/module3-adding-data-science-to-a-web-application/web-app/app/routes.py
new file mode 100644
index 00000000..dc06e3e6
--- /dev/null
+++ b/module3-adding-data-science-to-a-web-application/web-app/app/routes.py
@@ -0,0 +1,145 @@
+from flask import current_app as app
+from flask import render_template, url_for, redirect, request, flash, make_response
+from .models import User, Tweet, db, T_User, T_Tweet
+from app.Services.twitter_service import twitter_api_client
+from app.Services.basilica_service import basilica_api_client
+from sklearn.linear_model import LogisticRegression
+
+
+@app.route('/', methods = ['GET','POST'])
+def home():
+ users = User.query.all()
+ return render_template("home.html", users=users)
+
+@app.route('/insert_fake_user')
+def fake_user():
+ return render_template("tweets.html")
+
+@app.route('/create_tweet', methods=["POST"])
+def create_tweet():
+ name = request.form['Name']
+ id = request.form["Id"]
+ id_exist = User.query.filter_by(user_id=id).first()
+ name_id_exist = User.query.filter_by(user_id=id, name=name).first()
+
+ if id_exist:
+ if name_id_exist:
+ new_tweet = Tweet(tweet=request.form['Tweet'], user_id=request.form["Id"])
+ db.session.add(new_tweet)
+ else:
+ return make_response("The name does not match the Id!")
+ else:
+ new_user = User(name=request.form['Name'], user_id=request.form["Id"])
+ new_tweet = Tweet(tweet=request.form['Tweet'], user_id=request.form["Id"])
+ db.session.add(new_user)
+ db.session.add(new_tweet)
+
+ db.session.commit()
+ return redirect('/')
+
+@app.route('/')
+def get_user(screen_name=None):
+ # Instansiate twitter api class
+ api = twitter_api_client()
+ # grab username from url and create the api.get_user object
+ twitter_user = api.get_user(screen_name)
+ # Grab all the tweets from the username in the url
+ statuses = api.user_timeline(screen_name, tweet_mode="extended", count=500, exclude_replies=True, include_rts=False)
+ # Create a Twitter Username object if one doesn't exist already in the db
+ db_user = T_User.query.get(twitter_user.id) or T_User(id=twitter_user.id)
+ # Insert twitter screen name
+ db_user.screen_name = twitter_user.screen_name
+ # Insert twitter user name
+ db_user.name = twitter_user.name
+ # Insert twitter user location
+ db_user.location = twitter_user.location
+ # Insert twitter user follower count
+ db_user.followers_count = twitter_user.followers_count
+ # Add Twitter User Object into the db
+ db.session.add(db_user)
+ # Commit the changes onto the db
+ db.session.commit()
+ # Instansiate basilica api class
+ basilica_api = basilica_api_client()
+ # List comprehension that grabs all the tweets from status and puts it into full_text format
+ all_tweets = [status.full_text for status in statuses]
+ # Creates a list of all embedding values for each tweet in alL_tweets
+ embeddings = list(basilica_api.embed_sentences(all_tweets, model="twitter"))
+ # Create counter variable
+ counter = 0
+ # Iterate through each status in statuses
+ for status in statuses:
+ # create user twitter tweets object from the T_Tweet class if the id doesn't already exist in the db
+ db_tweet = T_Tweet.query.get(status.id) or T_Tweet(id=status.id)
+ # inserts the twitter user id as the tweet user id
+ db_tweet.user_id = db_user.id
+ # inserts the full tweet from the twitter user
+ db_tweet.full_text = status.full_text
+ # creates a variable that holds a single embedding value from a single tweet
+ embedding = embeddings[counter]
+ # inserts the embedding value from the user's tweet
+ db_tweet.embedding = embedding
+ # Add the changes to the db
+ db.session.add(db_tweet)
+ # Increase the counter by one to iterate through each tweet from the list
+ counter+=1
+ # commit changes
+ db.session.commit()
+ # Return string if everything worked properly
+ return "User has been added to the data base!... hopefully..."
+
+@app.route("/admin/db/reset")
+def reset_db():
+ print(type(db))
+ db.drop_all()
+ db.create_all()
+ return "Db has been reseted"
+
+# @app.route("/admin/db/seed")
+# def seed_db():
+# default_users = ['elonmusk', 'justinbieber', 's2t2']
+# for i in range(len(default_users)):
+# for users in default_users:
+# redirect(f'/{users}')
+# return "Done"
+
+@app.route("/predict")
+def predict_html():
+ return render_template("predict_layout.html")
+
+
+@app.route("/prediction",methods=["POST"])
+def prediction():
+ screen_name_a = request.form["User_A"]
+ screen_name_b = request.form["User_B"]
+ tweet_text = request.form["tweet"]
+
+ user_a = T_User.query.filter(T_User.screen_name == screen_name_a).one()
+ user_b = T_User.query.filter(T_User.screen_name == screen_name_b).one()
+
+ user_a_tweets = user_a.tweets
+ user_b_tweets = user_b.tweets
+
+ embeddings = []
+ labels = []
+
+ for tweet in user_a_tweets:
+ labels.append(user_a.screen_name)
+ embeddings.append(tweet.embedding)
+
+ for tweet in user_b_tweets:
+ labels.append(user_b.screen_name)
+ embeddings.append(tweet.embedding)
+
+ model = LogisticRegression(random_state=42, solver='lbfgs')
+ model.fit(embeddings, labels)
+
+ basilica_conn = basilica_api_client()
+ embed_tweet = basilica_conn.embed_sentence(tweet_text, model="twitter")
+ result = model.predict([embed_tweet])
+
+ return render_template("results.html",
+ screen_name_a=screen_name_a,
+ screen_name_b=screen_name_b,
+ tweet_text=tweet_text,
+ screen_name_most_likely=result[0])
\ No newline at end of file
diff --git a/module3-adding-data-science-to-a-web-application/web-app/app/templates/home.html b/module3-adding-data-science-to-a-web-application/web-app/app/templates/home.html
new file mode 100644
index 00000000..054c823d
--- /dev/null
+++ b/module3-adding-data-science-to-a-web-application/web-app/app/templates/home.html
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+ Twitter app thingy
+ Create a fake Twitter User
+ Current fake users in database:
+ {% if users %}
+ {% for user in users %}
+ {{user['name']}}
+ {% endfor %}
+ {% else %}
+ There are no users in our database
+ {% endif %}
+ Predict which user will predict given tweet
+
+
\ No newline at end of file
diff --git a/module3-adding-data-science-to-a-web-application/web-app/app/templates/predict_layout.html b/module3-adding-data-science-to-a-web-application/web-app/app/templates/predict_layout.html
new file mode 100644
index 00000000..442b5bc7
--- /dev/null
+++ b/module3-adding-data-science-to-a-web-application/web-app/app/templates/predict_layout.html
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+ Predict which user will predict given tweet
+
+
+
\ No newline at end of file
diff --git a/module3-adding-data-science-to-a-web-application/web-app/app/templates/results.html b/module3-adding-data-science-to-a-web-application/web-app/app/templates/results.html
new file mode 100644
index 00000000..7a8860c1
--- /dev/null
+++ b/module3-adding-data-science-to-a-web-application/web-app/app/templates/results.html
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+ Results!
+
+ Betwween '@{{screen_name_a}}' and '@{{screen_name_b}}',
+ The user who would most likely to say '{{tweet_text}}'
+ is '@{{screen_name_most_likely}}'
+
+
+
\ No newline at end of file
diff --git a/module3-adding-data-science-to-a-web-application/web-app/app/templates/tweets.html b/module3-adding-data-science-to-a-web-application/web-app/app/templates/tweets.html
new file mode 100644
index 00000000..b9e82d6d
--- /dev/null
+++ b/module3-adding-data-science-to-a-web-application/web-app/app/templates/tweets.html
@@ -0,0 +1,20 @@
+
+
+
+
+
+ Tweets
+
+
+ Create a fake twitter user that will be added into the database
+
+
+
\ No newline at end of file
diff --git a/module4-web-application-deployment/web-app/.vscode/settings.json b/module4-web-application-deployment/web-app/.vscode/settings.json
new file mode 100644
index 00000000..abc223ea
--- /dev/null
+++ b/module4-web-application-deployment/web-app/.vscode/settings.json
@@ -0,0 +1,3 @@
+{
+ "python.pythonPath": "/home/adriann/.local/share/virtualenvs/web-app-4nemaXEP/bin/python"
+}
\ No newline at end of file
diff --git a/module4-web-application-deployment/web-app/Pipfile b/module4-web-application-deployment/web-app/Pipfile
new file mode 100644
index 00000000..f6902931
--- /dev/null
+++ b/module4-web-application-deployment/web-app/Pipfile
@@ -0,0 +1,21 @@
+[[source]]
+name = "pypi"
+url = "https://pypi.org/simple"
+verify_ssl = true
+
+[dev-packages]
+pylint = "*"
+
+[packages]
+flask = "*"
+flask-sqlalchemy = "*"
+python-dotenv = "*"
+requests = "*"
+basilica = "*"
+tweepy = "*"
+scikit-learn = "*"
+gunicorn = "*"
+psycopg2-binary = "*"
+
+[requires]
+python_version = "3.7"
diff --git a/module4-web-application-deployment/web-app/Pipfile.lock b/module4-web-application-deployment/web-app/Pipfile.lock
new file mode 100644
index 00000000..c9267430
--- /dev/null
+++ b/module4-web-application-deployment/web-app/Pipfile.lock
@@ -0,0 +1,452 @@
+{
+ "_meta": {
+ "hash": {
+ "sha256": "955cd8129a588e1bdd953d42d7eee84e70e176cfa285d3c436c54e79e1d84c8b"
+ },
+ "pipfile-spec": 6,
+ "requires": {
+ "python_version": "3.7"
+ },
+ "sources": [
+ {
+ "name": "pypi",
+ "url": "https://pypi.org/simple",
+ "verify_ssl": true
+ }
+ ]
+ },
+ "default": {
+ "basilica": {
+ "hashes": [
+ "sha256:10d111538e7fee4ece43b9a2f0f33c8b6a34dc1a061e44c035b53ac4297e3a4d"
+ ],
+ "index": "pypi",
+ "version": "==0.2.8"
+ },
+ "certifi": {
+ "hashes": [
+ "sha256:017c25db2a153ce562900032d5bc68e9f191e44e9a0f762f373977de9df1fbb3",
+ "sha256:25b64c7da4cd7479594d035c08c2d809eb4aab3a26e5a990ea98cc450c320f1f"
+ ],
+ "version": "==2019.11.28"
+ },
+ "chardet": {
+ "hashes": [
+ "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae",
+ "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"
+ ],
+ "version": "==3.0.4"
+ },
+ "click": {
+ "hashes": [
+ "sha256:8a18b4ea89d8820c5d0c7da8a64b2c324b4dabb695804dbfea19b9be9d88c0cc",
+ "sha256:e345d143d80bf5ee7534056164e5e112ea5e22716bbb1ce727941f4c8b471b9a"
+ ],
+ "version": "==7.1.1"
+ },
+ "flask": {
+ "hashes": [
+ "sha256:13f9f196f330c7c2c5d7a5cf91af894110ca0215ac051b5844701f2bfd934d52",
+ "sha256:45eb5a6fd193d6cf7e0cf5d8a5b31f83d5faae0293695626f539a823e93b13f6"
+ ],
+ "index": "pypi",
+ "version": "==1.1.1"
+ },
+ "flask-sqlalchemy": {
+ "hashes": [
+ "sha256:0078d8663330dc05a74bc72b3b6ddc441b9a744e2f56fe60af1a5bfc81334327",
+ "sha256:6974785d913666587949f7c2946f7001e4fa2cb2d19f4e69ead02e4b8f50b33d"
+ ],
+ "index": "pypi",
+ "version": "==2.4.1"
+ },
+ "gunicorn": {
+ "hashes": [
+ "sha256:1904bb2b8a43658807108d59c3f3d56c2b6121a701161de0ddf9ad140073c626",
+ "sha256:cd4a810dd51bf497552cf3f863b575dabd73d6ad6a91075b65936b151cbf4f9c"
+ ],
+ "index": "pypi",
+ "version": "==20.0.4"
+ },
+ "idna": {
+ "hashes": [
+ "sha256:7588d1c14ae4c77d74036e8c22ff447b26d0fde8f007354fd48a7814db15b7cb",
+ "sha256:a068a21ceac8a4d63dbfd964670474107f541babbd2250d61922f029858365fa"
+ ],
+ "version": "==2.9"
+ },
+ "itsdangerous": {
+ "hashes": [
+ "sha256:321b033d07f2a4136d3ec762eac9f16a10ccd60f53c0c91af90217ace7ba1f19",
+ "sha256:b12271b2047cb23eeb98c8b5622e2e5c5e9abd9784a153e9d8ef9cb4dd09d749"
+ ],
+ "version": "==1.1.0"
+ },
+ "jinja2": {
+ "hashes": [
+ "sha256:93187ffbc7808079673ef52771baa950426fd664d3aad1d0fa3e95644360e250",
+ "sha256:b0eaf100007721b5c16c1fc1eecb87409464edc10469ddc9a22a27a99123be49"
+ ],
+ "version": "==2.11.1"
+ },
+ "joblib": {
+ "hashes": [
+ "sha256:0630eea4f5664c463f23fbf5dcfc54a2bc6168902719fa8e19daf033022786c8",
+ "sha256:bdb4fd9b72915ffb49fde2229ce482dd7ae79d842ed8c2b4c932441495af1403"
+ ],
+ "version": "==0.14.1"
+ },
+ "markupsafe": {
+ "hashes": [
+ "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473",
+ "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161",
+ "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235",
+ "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5",
+ "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42",
+ "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff",
+ "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b",
+ "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1",
+ "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e",
+ "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183",
+ "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66",
+ "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b",
+ "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1",
+ "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15",
+ "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1",
+ "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e",
+ "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b",
+ "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905",
+ "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735",
+ "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d",
+ "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e",
+ "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d",
+ "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c",
+ "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21",
+ "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2",
+ "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5",
+ "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b",
+ "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6",
+ "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f",
+ "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f",
+ "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2",
+ "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7",
+ "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"
+ ],
+ "version": "==1.1.1"
+ },
+ "numpy": {
+ "hashes": [
+ "sha256:1598a6de323508cfeed6b7cd6c4efb43324f4692e20d1f76e1feec7f59013448",
+ "sha256:1b0ece94018ae21163d1f651b527156e1f03943b986188dd81bc7e066eae9d1c",
+ "sha256:2e40be731ad618cb4974d5ba60d373cdf4f1b8dcbf1dcf4d9dff5e212baf69c5",
+ "sha256:4ba59db1fcc27ea31368af524dcf874d9277f21fd2e1f7f1e2e0c75ee61419ed",
+ "sha256:59ca9c6592da581a03d42cc4e270732552243dc45e87248aa8d636d53812f6a5",
+ "sha256:5e0feb76849ca3e83dd396254e47c7dba65b3fa9ed3df67c2556293ae3e16de3",
+ "sha256:6d205249a0293e62bbb3898c4c2e1ff8a22f98375a34775a259a0523111a8f6c",
+ "sha256:6fcc5a3990e269f86d388f165a089259893851437b904f422d301cdce4ff25c8",
+ "sha256:82847f2765835c8e5308f136bc34018d09b49037ec23ecc42b246424c767056b",
+ "sha256:87902e5c03355335fc5992a74ba0247a70d937f326d852fc613b7f53516c0963",
+ "sha256:9ab21d1cb156a620d3999dd92f7d1c86824c622873841d6b080ca5495fa10fef",
+ "sha256:a1baa1dc8ecd88fb2d2a651671a84b9938461e8a8eed13e2f0a812a94084d1fa",
+ "sha256:a244f7af80dacf21054386539699ce29bcc64796ed9850c99a34b41305630286",
+ "sha256:a35af656a7ba1d3decdd4fae5322b87277de8ac98b7d9da657d9e212ece76a61",
+ "sha256:b1fe1a6f3a6f355f6c29789b5927f8bd4f134a4bd9a781099a7c4f66af8850f5",
+ "sha256:b5ad0adb51b2dee7d0ee75a69e9871e2ddfb061c73ea8bc439376298141f77f5",
+ "sha256:ba3c7a2814ec8a176bb71f91478293d633c08582119e713a0c5351c0f77698da",
+ "sha256:cd77d58fb2acf57c1d1ee2835567cd70e6f1835e32090538f17f8a3a99e5e34b",
+ "sha256:cdb3a70285e8220875e4d2bc394e49b4988bdb1298ffa4e0bd81b2f613be397c",
+ "sha256:deb529c40c3f1e38d53d5ae6cd077c21f1d49e13afc7936f7f868455e16b64a0",
+ "sha256:e7894793e6e8540dbeac77c87b489e331947813511108ae097f1715c018b8f3d"
+ ],
+ "version": "==1.18.2"
+ },
+ "oauthlib": {
+ "hashes": [
+ "sha256:bee41cc35fcca6e988463cacc3bcb8a96224f470ca547e697b604cc697b2f889",
+ "sha256:df884cd6cbe20e32633f1db1072e9356f53638e4361bef4e8b03c9127c9328ea"
+ ],
+ "version": "==3.1.0"
+ },
+ "pillow": {
+ "hashes": [
+ "sha256:0a628977ac2e01ca96aaae247ec2bd38e729631ddf2221b4b715446fd45505be",
+ "sha256:4d9ed9a64095e031435af120d3c910148067087541131e82b3e8db302f4c8946",
+ "sha256:54ebae163e8412aff0b9df1e88adab65788f5f5b58e625dc5c7f51eaf14a6837",
+ "sha256:5bfef0b1cdde9f33881c913af14e43db69815c7e8df429ceda4c70a5e529210f",
+ "sha256:5f3546ceb08089cedb9e8ff7e3f6a7042bb5b37c2a95d392fb027c3e53a2da00",
+ "sha256:5f7ae9126d16194f114435ebb79cc536b5682002a4fa57fa7bb2cbcde65f2f4d",
+ "sha256:62a889aeb0a79e50ecf5af272e9e3c164148f4bd9636cc6bcfa182a52c8b0533",
+ "sha256:7406f5a9b2fd966e79e6abdaf700585a4522e98d6559ce37fc52e5c955fade0a",
+ "sha256:8453f914f4e5a3d828281a6628cf517832abfa13ff50679a4848926dac7c0358",
+ "sha256:87269cc6ce1e3dee11f23fa515e4249ae678dbbe2704598a51cee76c52e19cda",
+ "sha256:875358310ed7abd5320f21dd97351d62de4929b0426cdb1eaa904b64ac36b435",
+ "sha256:8ac6ce7ff3892e5deaab7abaec763538ffd011f74dc1801d93d3c5fc541feee2",
+ "sha256:91b710e3353aea6fc758cdb7136d9bbdcb26b53cefe43e2cba953ac3ee1d3313",
+ "sha256:9d2ba4ed13af381233e2d810ff3bab84ef9f18430a9b336ab69eaf3cd24299ff",
+ "sha256:a62ec5e13e227399be73303ff301f2865bf68657d15ea50b038d25fc41097317",
+ "sha256:ab76e5580b0ed647a8d8d2d2daee170e8e9f8aad225ede314f684e297e3643c2",
+ "sha256:bf4003aa538af3f4205c5fac56eacaa67a6dd81e454ffd9e9f055fff9f1bc614",
+ "sha256:bf598d2e37cf8edb1a2f26ed3fb255191f5232badea4003c16301cb94ac5bdd0",
+ "sha256:c18f70dc27cc5d236f10e7834236aff60aadc71346a5bc1f4f83a4b3abee6386",
+ "sha256:c5ed816632204a2fc9486d784d8e0d0ae754347aba99c811458d69fcdfd2a2f9",
+ "sha256:dc058b7833184970d1248135b8b0ab702e6daa833be14035179f2acb78ff5636",
+ "sha256:ff3797f2f16bf9d17d53257612da84dd0758db33935777149b3334c01ff68865"
+ ],
+ "version": "==7.0.0"
+ },
+ "psycopg2-binary": {
+ "hashes": [
+ "sha256:040234f8a4a8dfd692662a8308d78f63f31a97e1c42d2480e5e6810c48966a29",
+ "sha256:086f7e89ec85a6704db51f68f0dcae432eff9300809723a6e8782c41c2f48e03",
+ "sha256:18ca813fdb17bc1db73fe61b196b05dd1ca2165b884dd5ec5568877cabf9b039",
+ "sha256:19dc39616850342a2a6db70559af55b22955f86667b5f652f40c0e99253d9881",
+ "sha256:2166e770cb98f02ed5ee2b0b569d40db26788e0bf2ec3ae1a0d864ea6f1d8309",
+ "sha256:3a2522b1d9178575acee4adf8fd9f979f9c0449b00b4164bb63c3475ea6528ed",
+ "sha256:3aa773580f85a28ffdf6f862e59cb5a3cc7ef6885121f2de3fca8d6ada4dbf3b",
+ "sha256:3b5deaa3ee7180585a296af33e14c9b18c218d148e735c7accf78130765a47e3",
+ "sha256:407af6d7e46593415f216c7f56ba087a9a42bd6dc2ecb86028760aa45b802bd7",
+ "sha256:4c3c09fb674401f630626310bcaf6cd6285daf0d5e4c26d6e55ca26a2734e39b",
+ "sha256:4c6717962247445b4f9e21c962ea61d2e884fc17df5ddf5e35863b016f8a1f03",
+ "sha256:50446fae5681fc99f87e505d4e77c9407e683ab60c555ec302f9ac9bffa61103",
+ "sha256:5057669b6a66aa9ca118a2a860159f0ee3acf837eda937bdd2a64f3431361a2d",
+ "sha256:5dd90c5438b4f935c9d01fcbad3620253da89d19c1f5fca9158646407ed7df35",
+ "sha256:659c815b5b8e2a55193ede2795c1e2349b8011497310bb936da7d4745652823b",
+ "sha256:69b13fdf12878b10dc6003acc8d0abf3ad93e79813fd5f3812497c1c9fb9be49",
+ "sha256:7a1cb80e35e1ccea3e11a48afe65d38744a0e0bde88795cc56a4d05b6e4f9d70",
+ "sha256:7e6e3c52e6732c219c07bd97fff6c088f8df4dae3b79752ee3a817e6f32e177e",
+ "sha256:7f42a8490c4fe854325504ce7a6e4796b207960dabb2cbafe3c3959cb00d1d7e",
+ "sha256:84156313f258eafff716b2961644a4483a9be44a5d43551d554844d15d4d224e",
+ "sha256:8578d6b8192e4c805e85f187bc530d0f52ba86c39172e61cd51f68fddd648103",
+ "sha256:890167d5091279a27e2505ff0e1fb273f8c48c41d35c5b92adbf4af80e6b2ed6",
+ "sha256:98e10634792ac0e9e7a92a76b4991b44c2325d3e7798270a808407355e7bb0a1",
+ "sha256:9aadff9032e967865f9778485571e93908d27dab21d0fdfdec0ca779bb6f8ad9",
+ "sha256:9f24f383a298a0c0f9b3113b982e21751a8ecde6615494a3f1470eb4a9d70e9e",
+ "sha256:a73021b44813b5c84eda4a3af5826dd72356a900bac9bd9dd1f0f81ee1c22c2f",
+ "sha256:afd96845e12638d2c44d213d4810a08f4dc4a563f9a98204b7428e567014b1cd",
+ "sha256:b73ddf033d8cd4cc9dfed6324b1ad2a89ba52c410ef6877998422fcb9c23e3a8",
+ "sha256:b8f490f5fad1767a1331df1259763b3bad7d7af12a75b950c2843ba319b2415f",
+ "sha256:dbc5cd56fff1a6152ca59445178652756f4e509f672e49ccdf3d79c1043113a4",
+ "sha256:eac8a3499754790187bb00574ab980df13e754777d346f85e0ff6df929bcd964",
+ "sha256:eaed1c65f461a959284649e37b5051224f4db6ebdc84e40b5e65f2986f101a08"
+ ],
+ "index": "pypi",
+ "version": "==2.8.4"
+ },
+ "pysocks": {
+ "hashes": [
+ "sha256:08e69f092cc6dbe92a0fdd16eeb9b9ffbc13cadfe5ca4c7bd92ffb078b293299",
+ "sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5",
+ "sha256:3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0"
+ ],
+ "version": "==1.7.1"
+ },
+ "python-dotenv": {
+ "hashes": [
+ "sha256:81822227f771e0cab235a2939f0f265954ac4763cafd806d845801c863bf372f",
+ "sha256:92b3123fb2d58a284f76cc92bfe4ee6c502c32ded73e8b051c4f6afc8b6751ed"
+ ],
+ "index": "pypi",
+ "version": "==0.12.0"
+ },
+ "requests": {
+ "hashes": [
+ "sha256:43999036bfa82904b6af1d99e4882b560e5e2c68e5c4b0aa03b655f3d7d73fee",
+ "sha256:b3f43d496c6daba4493e7c431722aeb7dbc6288f52a6e04e7b6023b0247817e6"
+ ],
+ "index": "pypi",
+ "version": "==2.23.0"
+ },
+ "requests-oauthlib": {
+ "hashes": [
+ "sha256:7f71572defaecd16372f9006f33c2ec8c077c3cfa6f5911a9a90202beb513f3d",
+ "sha256:b4261601a71fd721a8bd6d7aa1cc1d6a8a93b4a9f5e96626f8e4d91e8beeaa6a"
+ ],
+ "version": "==1.3.0"
+ },
+ "scikit-learn": {
+ "hashes": [
+ "sha256:1bf45e62799b6938357cfce19f72e3751448c4b27010e4f98553da669b5bbd86",
+ "sha256:267ad874b54c67b479c3b45eb132ef4a56ab2b27963410624a413a4e2a3fc388",
+ "sha256:2d1bb83d6c51a81193d8a6b5f31930e2959c0e1019d49bdd03f54163735dae4b",
+ "sha256:349ba3d837fb3f7cb2b91486c43713e4b7de17f9e852f165049b1b7ac2f81478",
+ "sha256:3f4d8eea3531d3eaf613fa33f711113dfff6021d57a49c9d319af4afb46f72f0",
+ "sha256:4990f0e166292d2a0f0ee528233723bcfd238bfdb3ec2512a9e27f5695362f35",
+ "sha256:57538d138ba54407d21e27c306735cbd42a6aae0df6a5a30c7a6edde46b0017d",
+ "sha256:5b722e8bb708f254af028dc2da86d23df5371cba57e24f889b672e7b15423caa",
+ "sha256:6043e2c4ccfc68328c331b0fc19691be8fb02bd76d694704843a23ad651de902",
+ "sha256:672ea38eb59b739a8907ec063642b486bcb5a2073dda5b72b7983eeaf1fd67c1",
+ "sha256:73207dca6e70f8f611f28add185cf3a793c8232a1722f21d82259560dc35cd50",
+ "sha256:83fc104a799cb340054e485c25dfeee712b36f5638fb374eba45a9db490f16ff",
+ "sha256:8416150ab505f1813da02cdbdd9f367b05bfc75cf251235015bb09f8674358a0",
+ "sha256:84e759a766c315deb5c85139ff879edbb0aabcddb9358acf499564ed1c21e337",
+ "sha256:8ed66ab27b3d68e57bb1f315fc35e595a5c4a1f108c3420943de4d18fc40e615",
+ "sha256:a7f8aa93f61aaad080b29a9018db93ded0586692c03ddf2122e47dd1d3a14e1b",
+ "sha256:ddd3bf82977908ff69303115dd5697606e669d8a7eafd7d83bb153ef9e11bd5e",
+ "sha256:de9933297f8659ee3bb330eafdd80d74cd73d5dab39a9026b65a4156bc479063",
+ "sha256:ea91a70a992ada395efc3d510cf011dc2d99dc9037bb38cd1cb00e14745005f5",
+ "sha256:eb4c9f0019abb374a2e55150f070a333c8f990b850d1eb4dfc2765fc317ffc7c",
+ "sha256:ffce8abfdcd459e72e5b91727b247b401b22253cbd18d251f842a60e26262d6f"
+ ],
+ "index": "pypi",
+ "version": "==0.22.2.post1"
+ },
+ "scipy": {
+ "hashes": [
+ "sha256:00af72998a46c25bdb5824d2b729e7dabec0c765f9deb0b504f928591f5ff9d4",
+ "sha256:0902a620a381f101e184a958459b36d3ee50f5effd186db76e131cbefcbb96f7",
+ "sha256:1e3190466d669d658233e8a583b854f6386dd62d655539b77b3fa25bfb2abb70",
+ "sha256:2cce3f9847a1a51019e8c5b47620da93950e58ebc611f13e0d11f4980ca5fecb",
+ "sha256:3092857f36b690a321a662fe5496cb816a7f4eecd875e1d36793d92d3f884073",
+ "sha256:386086e2972ed2db17cebf88610aab7d7f6e2c0ca30042dc9a89cf18dcc363fa",
+ "sha256:71eb180f22c49066f25d6df16f8709f215723317cc951d99e54dc88020ea57be",
+ "sha256:770254a280d741dd3436919d47e35712fb081a6ff8bafc0f319382b954b77802",
+ "sha256:787cc50cab3020a865640aba3485e9fbd161d4d3b0d03a967df1a2881320512d",
+ "sha256:8a07760d5c7f3a92e440ad3aedcc98891e915ce857664282ae3c0220f3301eb6",
+ "sha256:8d3bc3993b8e4be7eade6dcc6fd59a412d96d3a33fa42b0fa45dc9e24495ede9",
+ "sha256:9508a7c628a165c2c835f2497837bf6ac80eb25291055f56c129df3c943cbaf8",
+ "sha256:a144811318853a23d32a07bc7fd5561ff0cac5da643d96ed94a4ffe967d89672",
+ "sha256:a1aae70d52d0b074d8121333bc807a485f9f1e6a69742010b33780df2e60cfe0",
+ "sha256:a2d6df9eb074af7f08866598e4ef068a2b310d98f87dc23bd1b90ec7bdcec802",
+ "sha256:bb517872058a1f087c4528e7429b4a44533a902644987e7b2fe35ecc223bc408",
+ "sha256:c5cac0c0387272ee0e789e94a570ac51deb01c796b37fb2aad1fb13f85e2f97d",
+ "sha256:cc971a82ea1170e677443108703a2ec9ff0f70752258d0e9f5433d00dda01f59",
+ "sha256:dba8306f6da99e37ea08c08fef6e274b5bf8567bb094d1dbe86a20e532aca088",
+ "sha256:dc60bb302f48acf6da8ca4444cfa17d52c63c5415302a9ee77b3b21618090521",
+ "sha256:dee1bbf3a6c8f73b6b218cb28eed8dd13347ea2f87d572ce19b289d6fd3fbc59"
+ ],
+ "version": "==1.4.1"
+ },
+ "six": {
+ "hashes": [
+ "sha256:236bdbdce46e6e6a3d61a337c0f8b763ca1e8717c03b369e87a7ec7ce1319c0a",
+ "sha256:8f3cd2e254d8f793e7f3d6d9df77b92252b52637291d0f0da013c76ea2724b6c"
+ ],
+ "version": "==1.14.0"
+ },
+ "sqlalchemy": {
+ "hashes": [
+ "sha256:c4cca4aed606297afbe90d4306b49ad3a4cd36feb3f87e4bfd655c57fd9ef445"
+ ],
+ "version": "==1.3.15"
+ },
+ "tweepy": {
+ "hashes": [
+ "sha256:8abd828ba51a85a2b5bb7373715d6d3bb32d18ac624e3a4db02e4ef8ab48316b",
+ "sha256:ecc7f200c86127903017e48824efd008734814e95f3e8e9b45ce0f4120dd08db"
+ ],
+ "index": "pypi",
+ "version": "==3.8.0"
+ },
+ "urllib3": {
+ "hashes": [
+ "sha256:2f3db8b19923a873b3e5256dc9c2dedfa883e33d87c690d9c7913e1f40673cdc",
+ "sha256:87716c2d2a7121198ebcb7ce7cccf6ce5e9ba539041cfbaeecfb641dc0bf6acc"
+ ],
+ "version": "==1.25.8"
+ },
+ "werkzeug": {
+ "hashes": [
+ "sha256:169ba8a33788476292d04186ab33b01d6add475033dfc07215e6d219cc077096",
+ "sha256:6dc65cf9091cf750012f56f2cad759fa9e879f511b5ff8685e456b4e3bf90d16"
+ ],
+ "version": "==1.0.0"
+ }
+ },
+ "develop": {
+ "astroid": {
+ "hashes": [
+ "sha256:71ea07f44df9568a75d0f354c49143a4575d90645e9fead6dfb52c26a85ed13a",
+ "sha256:840947ebfa8b58f318d42301cf8c0a20fd794a33b61cc4638e28e9e61ba32f42"
+ ],
+ "version": "==2.3.3"
+ },
+ "isort": {
+ "hashes": [
+ "sha256:54da7e92468955c4fceacd0c86bd0ec997b0e1ee80d97f67c35a78b719dccab1",
+ "sha256:6e811fcb295968434526407adb8796944f1988c5b65e8139058f2014cbe100fd"
+ ],
+ "version": "==4.3.21"
+ },
+ "lazy-object-proxy": {
+ "hashes": [
+ "sha256:0c4b206227a8097f05c4dbdd323c50edf81f15db3b8dc064d08c62d37e1a504d",
+ "sha256:194d092e6f246b906e8f70884e620e459fc54db3259e60cf69a4d66c3fda3449",
+ "sha256:1be7e4c9f96948003609aa6c974ae59830a6baecc5376c25c92d7d697e684c08",
+ "sha256:4677f594e474c91da97f489fea5b7daa17b5517190899cf213697e48d3902f5a",
+ "sha256:48dab84ebd4831077b150572aec802f303117c8cc5c871e182447281ebf3ac50",
+ "sha256:5541cada25cd173702dbd99f8e22434105456314462326f06dba3e180f203dfd",
+ "sha256:59f79fef100b09564bc2df42ea2d8d21a64fdcda64979c0fa3db7bdaabaf6239",
+ "sha256:8d859b89baf8ef7f8bc6b00aa20316483d67f0b1cbf422f5b4dc56701c8f2ffb",
+ "sha256:9254f4358b9b541e3441b007a0ea0764b9d056afdeafc1a5569eee1cc6c1b9ea",
+ "sha256:9651375199045a358eb6741df3e02a651e0330be090b3bc79f6d0de31a80ec3e",
+ "sha256:97bb5884f6f1cdce0099f86b907aa41c970c3c672ac8b9c8352789e103cf3156",
+ "sha256:9b15f3f4c0f35727d3a0fba4b770b3c4ebbb1fa907dbcc046a1d2799f3edd142",
+ "sha256:a2238e9d1bb71a56cd710611a1614d1194dc10a175c1e08d75e1a7bcc250d442",
+ "sha256:a6ae12d08c0bf9909ce12385803a543bfe99b95fe01e752536a60af2b7797c62",
+ "sha256:ca0a928a3ddbc5725be2dd1cf895ec0a254798915fb3a36af0964a0a4149e3db",
+ "sha256:cb2c7c57005a6804ab66f106ceb8482da55f5314b7fcb06551db1edae4ad1531",
+ "sha256:d74bb8693bf9cf75ac3b47a54d716bbb1a92648d5f781fc799347cfc95952383",
+ "sha256:d945239a5639b3ff35b70a88c5f2f491913eb94871780ebfabb2568bd58afc5a",
+ "sha256:eba7011090323c1dadf18b3b689845fd96a61ba0a1dfbd7f24b921398affc357",
+ "sha256:efa1909120ce98bbb3777e8b6f92237f5d5c8ea6758efea36a473e1d38f7d3e4",
+ "sha256:f3900e8a5de27447acbf900b4750b0ddfd7ec1ea7fbaf11dfa911141bc522af0"
+ ],
+ "version": "==1.4.3"
+ },
+ "mccabe": {
+ "hashes": [
+ "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42",
+ "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"
+ ],
+ "version": "==0.6.1"
+ },
+ "pylint": {
+ "hashes": [
+ "sha256:3db5468ad013380e987410a8d6956226963aed94ecb5f9d3a28acca6d9ac36cd",
+ "sha256:886e6afc935ea2590b462664b161ca9a5e40168ea99e5300935f6591ad467df4"
+ ],
+ "index": "pypi",
+ "version": "==2.4.4"
+ },
+ "six": {
+ "hashes": [
+ "sha256:236bdbdce46e6e6a3d61a337c0f8b763ca1e8717c03b369e87a7ec7ce1319c0a",
+ "sha256:8f3cd2e254d8f793e7f3d6d9df77b92252b52637291d0f0da013c76ea2724b6c"
+ ],
+ "version": "==1.14.0"
+ },
+ "typed-ast": {
+ "hashes": [
+ "sha256:0666aa36131496aed8f7be0410ff974562ab7eeac11ef351def9ea6fa28f6355",
+ "sha256:0c2c07682d61a629b68433afb159376e24e5b2fd4641d35424e462169c0a7919",
+ "sha256:249862707802d40f7f29f6e1aad8d84b5aa9e44552d2cc17384b209f091276aa",
+ "sha256:24995c843eb0ad11a4527b026b4dde3da70e1f2d8806c99b7b4a7cf491612652",
+ "sha256:269151951236b0f9a6f04015a9004084a5ab0d5f19b57de779f908621e7d8b75",
+ "sha256:4083861b0aa07990b619bd7ddc365eb7fa4b817e99cf5f8d9cf21a42780f6e01",
+ "sha256:498b0f36cc7054c1fead3d7fc59d2150f4d5c6c56ba7fb150c013fbc683a8d2d",
+ "sha256:4e3e5da80ccbebfff202a67bf900d081906c358ccc3d5e3c8aea42fdfdfd51c1",
+ "sha256:6daac9731f172c2a22ade6ed0c00197ee7cc1221aa84cfdf9c31defeb059a907",
+ "sha256:715ff2f2df46121071622063fc7543d9b1fd19ebfc4f5c8895af64a77a8c852c",
+ "sha256:73d785a950fc82dd2a25897d525d003f6378d1cb23ab305578394694202a58c3",
+ "sha256:8c8aaad94455178e3187ab22c8b01a3837f8ee50e09cf31f1ba129eb293ec30b",
+ "sha256:8ce678dbaf790dbdb3eba24056d5364fb45944f33553dd5869b7580cdbb83614",
+ "sha256:aaee9905aee35ba5905cfb3c62f3e83b3bec7b39413f0a7f19be4e547ea01ebb",
+ "sha256:bcd3b13b56ea479b3650b82cabd6b5343a625b0ced5429e4ccad28a8973f301b",
+ "sha256:c9e348e02e4d2b4a8b2eedb48210430658df6951fa484e59de33ff773fbd4b41",
+ "sha256:d205b1b46085271b4e15f670058ce182bd1199e56b317bf2ec004b6a44f911f6",
+ "sha256:d43943ef777f9a1c42bf4e552ba23ac77a6351de620aa9acf64ad54933ad4d34",
+ "sha256:d5d33e9e7af3b34a40dc05f498939f0ebf187f07c385fd58d591c533ad8562fe",
+ "sha256:fc0fea399acb12edbf8a628ba8d2312f583bdbdb3335635db062fa98cf71fca4",
+ "sha256:fe460b922ec15dd205595c9b5b99e2f056fd98ae8f9f56b888e7a17dc2b757e7"
+ ],
+ "markers": "implementation_name == 'cpython' and python_version < '3.8'",
+ "version": "==1.4.1"
+ },
+ "wrapt": {
+ "hashes": [
+ "sha256:565a021fd19419476b9362b05eeaa094178de64f8361e44468f9e9d7843901e1"
+ ],
+ "version": "==1.11.2"
+ }
+ }
+}
diff --git a/module4-web-application-deployment/web-app/Procfile b/module4-web-application-deployment/web-app/Procfile
new file mode 100644
index 00000000..e69de29b
diff --git a/module4-web-application-deployment/web-app/app/Services/basilica_service.py b/module4-web-application-deployment/web-app/app/Services/basilica_service.py
new file mode 100644
index 00000000..8872e477
--- /dev/null
+++ b/module4-web-application-deployment/web-app/app/Services/basilica_service.py
@@ -0,0 +1,21 @@
+import basilica
+import os
+from dotenv import load_dotenv
+
+load_dotenv()
+
+API_KEY = os.getenv("BASILICA_API_KEY")
+def basilica_api_client():
+ connection = basilica.Connection(API_KEY)
+ return connection
+
+if __name__ == "__main__":
+ connection = basilica.Connection(API_KEY)
+
+ sentences = ["Hello world!", "How are you?"]
+
+ print(sentences)
+
+ embeddings = connection.embed_sentences(sentences)
+
+ print(list(embeddings)) # [[0.8556405305862427, ...], ...]
\ No newline at end of file
diff --git a/module4-web-application-deployment/web-app/app/Services/stock_service.py b/module4-web-application-deployment/web-app/app/Services/stock_service.py
new file mode 100644
index 00000000..1323ea34
--- /dev/null
+++ b/module4-web-application-deployment/web-app/app/Services/stock_service.py
@@ -0,0 +1,19 @@
+import requests
+import json
+import os
+from dotenv import load_dotenv
+
+load_dotenv()
+
+API_KEY = os.getenv("ALPHAVANTAGE_API_KEY")
+
+request_url = f"https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=TSLA&apikey={API_KEY}"
+print(request_url)
+response = requests.get(request_url)
+print(type(response)) #>
+print(response.status_code) #> 200
+print(type(response.text)) #>
+parsed_response = json.loads(response.text)
+print(type(parsed_response)) #>
+latest_close = parsed_response["Time Series (Daily)"]["2020-02-25"]["4. close"]
+print("LATEST CLOSING PRICE:", latest_close)
\ No newline at end of file
diff --git a/module4-web-application-deployment/web-app/app/Services/twitter_service.py b/module4-web-application-deployment/web-app/app/Services/twitter_service.py
new file mode 100644
index 00000000..7b0121d3
--- /dev/null
+++ b/module4-web-application-deployment/web-app/app/Services/twitter_service.py
@@ -0,0 +1,49 @@
+import os
+from dotenv import load_dotenv
+import tweepy
+from pprint import pprint
+
+load_dotenv()
+
+consumer_key = os.getenv("TWITTER_API_KEY", default="OOPS")
+consumer_secret = os.getenv("TWITTER_API_SECRET", default="OOPS")
+access_token = os.getenv("TWITTER_ACCESS_TOKEN", default="OOPS")
+access_token_secret = os.getenv("TWITTER_ACCESS_TOKEN_SECRET", default="OOPS")
+
+def twitter_api_client():
+ auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
+ auth.set_access_token(access_token, access_token_secret)
+# print("AUTH", type(auth))
+ api = tweepy.API(auth)
+ return api
+# print("API", type(api)) #>
+
+#breakpoint()
+#public_tweets = api.home_timeline()
+#for tweet in public_tweets:
+# print(tweet.text)
+# get information about a twitter user:
+
+if __name__ == "__main__":
+ api = twitter_api_client()
+ screen_name = "elonmusk"
+ print("--------------")
+
+ print("USER...")
+ user = api.get_user(screen_name)
+ print(type(user)) #>
+ print(user.screen_name)
+ print(user.followers_count)
+ pprint(user._json)
+ print("--------------")
+
+ print("STATUSES...")
+ # get that user's tweets:
+ # see: http://docs.tweepy.org/en/latest/api.html#API.user_timeline
+ statuses = api.user_timeline(screen_name, tweet_mode="extended", count=150, exclude_replies=True, include_rts=False)
+
+ for status in statuses:
+ print(type(status)) #>
+ #pprint(status._json)
+ #breakpoint()
+ print(status.full_text)
\ No newline at end of file
diff --git a/module4-web-application-deployment/web-app/app/__init__.py b/module4-web-application-deployment/web-app/app/__init__.py
new file mode 100644
index 00000000..130d06c0
--- /dev/null
+++ b/module4-web-application-deployment/web-app/app/__init__.py
@@ -0,0 +1,20 @@
+from flask import Flask
+from flask_sqlalchemy import SQLAlchemy
+
+
+db = SQLAlchemy()
+
+
+def create_app():
+ app = Flask(__name__, instance_relative_config=False)
+ app.config.from_object("config.Config")
+ db.init_app(app)
+
+ with app.app_context():
+
+ # import our routes
+ from . import routes
+
+ db.create_all()
+
+ return app
\ No newline at end of file
diff --git a/module4-web-application-deployment/web-app/app/forms.py b/module4-web-application-deployment/web-app/app/forms.py
new file mode 100644
index 00000000..e69de29b
diff --git a/module4-web-application-deployment/web-app/app/models.py b/module4-web-application-deployment/web-app/app/models.py
new file mode 100644
index 00000000..944dcd33
--- /dev/null
+++ b/module4-web-application-deployment/web-app/app/models.py
@@ -0,0 +1,32 @@
+# Create some database models
+
+from app import db
+
+class User(db.Model):
+ id = db.Column(db.Integer, primary_key=True)
+ name = db.Column(db.String, nullable=False)
+ user_id = db.Column(db.Integer, nullable=False)
+
+class Tweet(db.Model):
+ id = db.Column(db.Integer, primary_key=True)
+ tweet = db.Column(db.String, nullable=False)
+ user_id = db.Column(db.Integer, nullable=False)
+
+class T_User(db.Model):
+
+ __tablename__ = "t_user"
+
+ id = db.Column(db.BigInteger, primary_key=True)
+ screen_name = db.Column(db.String(128), nullable=False)
+ name = db.Column(db.String)
+ location = db.Column(db.String)
+ followers_count = db.Column(db.Integer)
+ latest_tweet_id = db.Column(db.BigInteger)
+
+class T_Tweet(db.Model):
+ id = db.Column(db.BigInteger, primary_key=True)
+ user_id = db.Column(db.BigInteger, db.ForeignKey("t_user.id"))
+ full_text = db.Column (db.String(500))
+ embedding = db.Column(db.PickleType)
+
+ user = db.relationship("T_User", backref=db.backref("tweets", lazy=True))
\ No newline at end of file
diff --git a/module4-web-application-deployment/web-app/app/routes.py b/module4-web-application-deployment/web-app/app/routes.py
new file mode 100644
index 00000000..138bf2e0
--- /dev/null
+++ b/module4-web-application-deployment/web-app/app/routes.py
@@ -0,0 +1,145 @@
+from flask import current_app as app
+from flask import render_template, url_for, redirect, request, flash, make_response
+from .models import User, Tweet, db, T_User, T_Tweet
+from app.Services.twitter_service import twitter_api_client
+from app.Services.basilica_service import basilica_api_client
+from sklearn.linear_model import LogisticRegression
+
+
+@app.route('/', methods = ['GET','POST'])
+def home():
+ return render_template("home.html")
+
+@app.route('/insert_fake_user')
+def fake_user():
+ users = User.query.all()
+ return render_template("tweets.html", users=users)
+
+@app.route('/create_tweet', methods=["POST"])
+def create_tweet():
+ name = request.form['Name']
+ id = request.form["Id"]
+ id_exist = User.query.filter_by(user_id=id).first()
+ name_id_exist = User.query.filter_by(user_id=id, name=name).first()
+
+ if id_exist:
+ if name_id_exist:
+ new_tweet = Tweet(tweet=request.form['Tweet'], user_id=request.form["Id"])
+ db.session.add(new_tweet)
+ else:
+ return make_response("The name does not match the Id!")
+ else:
+ new_user = User(name=request.form['Name'], user_id=request.form["Id"])
+ new_tweet = Tweet(tweet=request.form['Tweet'], user_id=request.form["Id"])
+ db.session.add(new_user)
+ db.session.add(new_tweet)
+
+ db.session.commit()
+ return redirect('/')
+
+@app.route('/')
+def get_user(screen_name=None):
+ # Instansiate twitter api class
+ api = twitter_api_client()
+ # grab username from url and create the api.get_user object
+ twitter_user = api.get_user(screen_name)
+ # Grab all the tweets from the username in the url
+ statuses = api.user_timeline(screen_name, tweet_mode="extended", count=500, exclude_replies=True, include_rts=False)
+ # Create a Twitter Username object if one doesn't exist already in the db
+ db_user = T_User.query.get(twitter_user.id) or T_User(id=twitter_user.id)
+ # Insert twitter screen name
+ db_user.screen_name = twitter_user.screen_name
+ # Insert twitter user name
+ db_user.name = twitter_user.name
+ # Insert twitter user location
+ db_user.location = twitter_user.location
+ # Insert twitter user follower count
+ db_user.followers_count = twitter_user.followers_count
+ # Add Twitter User Object into the db
+ db.session.add(db_user)
+ # Commit the changes onto the db
+ db.session.commit()
+ # Instansiate basilica api class
+ basilica_api = basilica_api_client()
+ # List comprehension that grabs all the tweets from status and puts it into full_text format
+ all_tweets = [status.full_text for status in statuses]
+ # Creates a list of all embedding values for each tweet in alL_tweets
+ embeddings = list(basilica_api.embed_sentences(all_tweets, model="twitter"))
+ # Create counter variable
+ counter = 0
+ # Iterate through each status in statuses
+ for status in statuses:
+ # create user twitter tweets object from the T_Tweet class if the id doesn't already exist in the db
+ db_tweet = T_Tweet.query.get(status.id) or T_Tweet(id=status.id)
+ # inserts the twitter user id as the tweet user id
+ db_tweet.user_id = db_user.id
+ # inserts the full tweet from the twitter user
+ db_tweet.full_text = status.full_text
+ # creates a variable that holds a single embedding value from a single tweet
+ embedding = embeddings[counter]
+ # inserts the embedding value from the user's tweet
+ db_tweet.embedding = embedding
+ # Add the changes to the db
+ db.session.add(db_tweet)
+ # Increase the counter by one to iterate through each tweet from the list
+ counter+=1
+ # commit changes
+ db.session.commit()
+ # Return string if everything worked properly
+ return "User has been added to the data base!... hopefully..."
+
+@app.route("/admin/db/reset")
+def reset_db():
+ print(type(db))
+ db.drop_all()
+ db.create_all()
+ return "Db has been reseted"
+
+# @app.route("/admin/db/seed")
+# def seed_db():
+# default_users = ['elonmusk', 'justinbieber', 's2t2']
+# for i in range(len(default_users)):
+# for users in default_users:
+# redirect(f'/{users}')
+# return "Done"
+
+@app.route("/predict")
+def predict_html():
+ return render_template("predict_layout.html")
+
+
+@app.route("/prediction",methods=["POST"])
+def prediction():
+ screen_name_a = request.form["User_A"]
+ screen_name_b = request.form["User_B"]
+ tweet_text = request.form["tweet"]
+
+ user_a = T_User.query.filter(T_User.screen_name == screen_name_a).one()
+ user_b = T_User.query.filter(T_User.screen_name == screen_name_b).one()
+
+ user_a_tweets = user_a.tweets
+ user_b_tweets = user_b.tweets
+
+ embeddings = []
+ labels = []
+
+ for tweet in user_a_tweets:
+ labels.append(user_a.screen_name)
+ embeddings.append(tweet.embedding)
+
+ for tweet in user_b_tweets:
+ labels.append(user_b.screen_name)
+ embeddings.append(tweet.embedding)
+
+ model = LogisticRegression(random_state=42, solver='lbfgs')
+ model.fit(embeddings, labels)
+
+ basilica_conn = basilica_api_client()
+ embed_tweet = basilica_conn.embed_sentence(tweet_text, model="twitter")
+ result = model.predict([embed_tweet])
+
+ return render_template("results.html",
+ screen_name_a=screen_name_a,
+ screen_name_b=screen_name_b,
+ tweet_text=tweet_text,
+ screen_name_most_likely=result[0])
\ No newline at end of file
diff --git a/module4-web-application-deployment/web-app/app/templates/home.html b/module4-web-application-deployment/web-app/app/templates/home.html
new file mode 100644
index 00000000..3b58eef2
--- /dev/null
+++ b/module4-web-application-deployment/web-app/app/templates/home.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+ Twitter app thingy
+ Create a fake Twitter User
+ Predict which user will predict given tweet
+
+
\ No newline at end of file
diff --git a/module4-web-application-deployment/web-app/app/templates/predict_layout.html b/module4-web-application-deployment/web-app/app/templates/predict_layout.html
new file mode 100644
index 00000000..574f8cd0
--- /dev/null
+++ b/module4-web-application-deployment/web-app/app/templates/predict_layout.html
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+ Predict which user will predict given tweet
+
+
+
\ No newline at end of file
diff --git a/module4-web-application-deployment/web-app/app/templates/results.html b/module4-web-application-deployment/web-app/app/templates/results.html
new file mode 100644
index 00000000..4adb8f65
--- /dev/null
+++ b/module4-web-application-deployment/web-app/app/templates/results.html
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+ Results!
+
+ Betwween '@{{screen_name_a}}' and '@{{screen_name_b}}',
+ The user who would most likely to say '{{tweet_text}}'
+ is '@{{screen_name_most_likely}}'
+
+ Return Home
+
+
\ No newline at end of file
diff --git a/module4-web-application-deployment/web-app/app/templates/tweets.html b/module4-web-application-deployment/web-app/app/templates/tweets.html
new file mode 100644
index 00000000..cd9ba29f
--- /dev/null
+++ b/module4-web-application-deployment/web-app/app/templates/tweets.html
@@ -0,0 +1,29 @@
+
+
+
+
+
+ Tweets
+
+
+ Create a fake twitter user that will be added into the database
+
+ Current fake users in database:
+ {% if users %}
+ {% for user in users %}
+ {{user['name']}}
+ {% endfor %}
+ {% else %}
+ There are no users in the database
+ {% endif %}
+ Return Home
+
+
\ No newline at end of file
diff --git a/module4-web-application-deployment/web-app/app/test_db.sqlite b/module4-web-application-deployment/web-app/app/test_db.sqlite
new file mode 100644
index 00000000..a2ead229
Binary files /dev/null and b/module4-web-application-deployment/web-app/app/test_db.sqlite differ
diff --git a/module4-web-application-deployment/web-app/config.py b/module4-web-application-deployment/web-app/config.py
new file mode 100644
index 00000000..954bf58e
--- /dev/null
+++ b/module4-web-application-deployment/web-app/config.py
@@ -0,0 +1,12 @@
+from dotenv import load_dotenv
+import os
+
+load_dotenv()
+
+class Config:
+ """ Base configuration reading from .env file """
+
+ DEBUG = os.environ.get("DEBUG")
+ SECRETKEY = os.environ.get("SECRET_KEY")
+ SQLALCHEMY_DATABASE_URI = os.environ.get("DB_ADDRESS")
+ SQLALCHEMY_TRACK_MODIFICATIONS = os.environ.get("TRACK_MOD")
\ No newline at end of file
diff --git a/module4-web-application-deployment/web-app/run.py b/module4-web-application-deployment/web-app/run.py
new file mode 100644
index 00000000..54a05896
--- /dev/null
+++ b/module4-web-application-deployment/web-app/run.py
@@ -0,0 +1,7 @@
+from app import create_app
+
+app = create_app()
+
+if __name__ == "__main__":
+ # run this app
+ app.run()
\ No newline at end of file