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

    +
    + + + + + + + +
  • Return Home
  • +
    + + \ 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