From 71df3f1dff92a802a97ea88d12a85fb8d7a2fcbe Mon Sep 17 00:00:00 2001 From: RAV10K1 Date: Fri, 22 May 2020 20:30:22 -0700 Subject: [PATCH 01/11] answered some questions --- module1-introduction-to-sql/README.md | 54 ++++++++++++++++++++-- module1-introduction-to-sql/rpg_db.sqbpro | 1 + module1-introduction-to-sql/rpg_queries.py | 9 ++++ 3 files changed, 61 insertions(+), 3 deletions(-) create mode 100644 module1-introduction-to-sql/rpg_db.sqbpro create mode 100644 module1-introduction-to-sql/rpg_queries.py diff --git a/module1-introduction-to-sql/README.md b/module1-introduction-to-sql/README.md index 40497956..409a2023 100644 --- a/module1-introduction-to-sql/README.md +++ b/module1-introduction-to-sql/README.md @@ -51,12 +51,60 @@ randomized, the numeric and boolean fields were left as defaults. Use `sqlite3` to load and write queries to explore the data, and answer the following questions: -- How many total Characters are there? +- How many total Characters are there? 302 + SELECT + count(character_id) +FROM charactercreator_character + - How many of each specific subclass? -- How many total Items? -- How many of the Items are weapons? How many are not? + Cleric = 75 + Fighter = 68 + Mage = 108 + Necromancer = 11 + Thief = 51 + SELECT + COUNT() + FROM charactercreator_cleric + SELECT + COUNT() + FROM charactercreator_fighter + SELECT + COUNT() + FROM charactercreator_mage + SELECT + COUNT() + FROM charactercreator_necromancer + SELECT + COUNT() + FROM charactercreator_thief + +- How many total Items? 211 + SELECT + (select COUNT(item_id) FROM armory_item) + + (select COUNT(item_ptr_id) FROM armory_weapon) + AS Total_Items + +- How many of the Items are weapons? How many are not? + Weapons = 37, Other items = 174 + SELECT + COUNT() + FROM armory_weapon + - How many Items does each character have? (Return first 20 rows) + SELECT + character_id + ,count(item_id) + FROM charactercreator_character_inventory + GROUP BY character_id + LIMIT 20 + - How many Weapons does each character have? (Return first 20 rows) + SELECT character_id, count(item_id) + FROM charactercreator_character_inventory LEFT JOIN armory_weapon + ON item_id = item_ptr_id + GROUP BY character_id + LIMIT 20 + - On average, how many Items does each Character have? - On average, how many Weapons does each character have? diff --git a/module1-introduction-to-sql/rpg_db.sqbpro b/module1-introduction-to-sql/rpg_db.sqbpro new file mode 100644 index 00000000..3abbd46e --- /dev/null +++ b/module1-introduction-to-sql/rpg_db.sqbpro @@ -0,0 +1 @@ +
diff --git a/module1-introduction-to-sql/rpg_queries.py b/module1-introduction-to-sql/rpg_queries.py new file mode 100644 index 00000000..9fb0620d --- /dev/null +++ b/module1-introduction-to-sql/rpg_queries.py @@ -0,0 +1,9 @@ +import os +import sqlite3 + +# DB_FILEPATH = os.path.join(os.path.dirname(__file__), "..", "chinook.db") + + +SELECT + count(character_id) +FROM charactercreator_character \ No newline at end of file From 9ed32969a4555051c2fbe2a2b3bcdc63ce8e51b3 Mon Sep 17 00:00:00 2001 From: RAV10K1 Date: Mon, 25 May 2020 08:54:20 -0700 Subject: [PATCH 02/11] added queries --- module1-introduction-to-sql/README.md | 1 + module1-introduction-to-sql/buddymove_holidayiq.py | 0 2 files changed, 1 insertion(+) create mode 100644 module1-introduction-to-sql/buddymove_holidayiq.py diff --git a/module1-introduction-to-sql/README.md b/module1-introduction-to-sql/README.md index 409a2023..230e29f9 100644 --- a/module1-introduction-to-sql/README.md +++ b/module1-introduction-to-sql/README.md @@ -106,6 +106,7 @@ FROM charactercreator_character LIMIT 20 - On average, how many Items does each Character have? + - On average, how many Weapons does each character have? You do not need all the tables - in particular, the `account_*`, `auth_*`, diff --git a/module1-introduction-to-sql/buddymove_holidayiq.py b/module1-introduction-to-sql/buddymove_holidayiq.py new file mode 100644 index 00000000..e69de29b From 9f14441d193ac4e47b3c486e1e826487e646585b Mon Sep 17 00:00:00 2001 From: RAV10K1 Date: Mon, 25 May 2020 09:31:46 -0700 Subject: [PATCH 03/11] edited .csv --- module1-introduction-to-sql/buddymove_holidayiq.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/module1-introduction-to-sql/buddymove_holidayiq.py b/module1-introduction-to-sql/buddymove_holidayiq.py index e69de29b..743c40a2 100644 --- a/module1-introduction-to-sql/buddymove_holidayiq.py +++ b/module1-introduction-to-sql/buddymove_holidayiq.py @@ -0,0 +1,6 @@ +import pandas as pd + +file_path = 'https://github.com/RAV10K1/DS-Unit-3-Sprint-2-SQL-and-Databases/blob/master/module1-introduction-to-sql/buddymove_holidayiq.csv' +df = pd.read_csv(file_path) + +df.head() \ No newline at end of file From e77b65c4de9928e49be6e899a4266d9a68cbeda2 Mon Sep 17 00:00:00 2001 From: RAV10K1 Date: Mon, 25 May 2020 11:45:09 -0700 Subject: [PATCH 04/11] completed --- module1-introduction-to-sql/README.md | 18 +++++++++- .../buddymove_holidayiq.py | 24 +++++++++++-- .../buddymove_holidayiq.sqlite3 | Bin 0 -> 20480 bytes .../data/rgb_db.sqlite3 | 0 .../data/rpg_db.sqlite3 | Bin 0 -> 253952 bytes module1-introduction-to-sql/rpg_db.sqbpro | 1 - module1-introduction-to-sql/rpg_queries.py | 34 +++++++++++++++--- 7 files changed, 68 insertions(+), 9 deletions(-) create mode 100644 module1-introduction-to-sql/buddymove_holidayiq.sqlite3 create mode 100644 module1-introduction-to-sql/data/rgb_db.sqlite3 create mode 100644 module1-introduction-to-sql/data/rpg_db.sqlite3 delete mode 100644 module1-introduction-to-sql/rpg_db.sqbpro diff --git a/module1-introduction-to-sql/README.md b/module1-introduction-to-sql/README.md index 230e29f9..52018fca 100644 --- a/module1-introduction-to-sql/README.md +++ b/module1-introduction-to-sql/README.md @@ -106,8 +106,24 @@ FROM charactercreator_character LIMIT 20 - On average, how many Items does each Character have? - + SELECT + character_id + ,COUNT(item_id) as 'No_of_Items' + ,ROUND(AVG(item_id)) + FROM charactercreator_character_inventory + GROUP BY character_id + ORDER BY character_id + LIMIT 20 + - On average, how many Weapons does each character have? + SELECT + character_id + ,count(item_id) + ,round(avg(item_ptr_id)) +FROM charactercreator_character_inventory LEFT JOIN armory_weapon +ON item_id = item_ptr_id +GROUP BY character_id +LIMIT 20 You do not need all the tables - in particular, the `account_*`, `auth_*`, `django_*`, and `socialaccount_*` tables are for the application and do not have diff --git a/module1-introduction-to-sql/buddymove_holidayiq.py b/module1-introduction-to-sql/buddymove_holidayiq.py index 743c40a2..01e25052 100644 --- a/module1-introduction-to-sql/buddymove_holidayiq.py +++ b/module1-introduction-to-sql/buddymove_holidayiq.py @@ -1,6 +1,26 @@ import pandas as pd +import os.path +import sqlite3 -file_path = 'https://github.com/RAV10K1/DS-Unit-3-Sprint-2-SQL-and-Databases/blob/master/module1-introduction-to-sql/buddymove_holidayiq.csv' +file_path = 'https://archive.ics.uci.edu/ml/machine-learning-databases/00476/buddymove_holidayiq.csv' df = pd.read_csv(file_path) +print(f'DATA FRAME SHAPE : {df.shape}') -df.head() \ No newline at end of file +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +DB_FILEPATH = os.path.join(BASE_DIR, 'buddymove_holidayiq.sqlite3') + +connection = sqlite3.connect(DB_FILEPATH) +print("CONNECTION:", connection) + +cursor = connection.cursor() +print("CURSOR", cursor) + +df.to_sql(name='review', con=connection) + +no_rows = 'SELECT COUNT(*) FROM review' +result_rows = cursor.execute(no_rows).fetchall() +print('No. of Rows :', result_rows) + +reviews = 'SELECT COUNT(Nature), COUNT(Shopping) FROM review WHERE Nature >= 100 AND Shopping >= 100' +result_reviews = cursor.execute(reviews).fetchall() +print('No. of Users Reviewing Nature & Shopping at >= 100 :', result_reviews) \ No newline at end of file diff --git a/module1-introduction-to-sql/buddymove_holidayiq.sqlite3 b/module1-introduction-to-sql/buddymove_holidayiq.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..0814583aa9c5b188780d3ab920f772e83929e193 GIT binary patch literal 20480 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 literal 0 HcmV?d00001 diff --git a/module1-introduction-to-sql/data/rgb_db.sqlite3 b/module1-introduction-to-sql/data/rgb_db.sqlite3 new file mode 100644 index 00000000..e69de29b diff --git a/module1-introduction-to-sql/data/rpg_db.sqlite3 b/module1-introduction-to-sql/data/rpg_db.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..837d7f16116f34e53935a4560c69acb17766b29d GIT binary patch literal 253952 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
diff --git a/module1-introduction-to-sql/rpg_queries.py b/module1-introduction-to-sql/rpg_queries.py index 9fb0620d..5ee28131 100644 --- a/module1-introduction-to-sql/rpg_queries.py +++ b/module1-introduction-to-sql/rpg_queries.py @@ -1,9 +1,33 @@ -import os +import os.path import sqlite3 -# DB_FILEPATH = os.path.join(os.path.dirname(__file__), "..", "chinook.db") +# construct a path to wherever your database exists +# DB_FILEPATH = 'https://github.com/RAV10K1/DS-Unit-3-Sprint-2-SQL-and-Databases/blob/master/module1-introduction-to-sql/rpg_db.sqlite3' +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +DB_FILEPATH = os.path.join(BASE_DIR, 'rpg_db.sqlite3') +connection = sqlite3.connect(DB_FILEPATH) +print("CONNECTION:", connection) -SELECT - count(character_id) -FROM charactercreator_character \ No newline at end of file +cursor = connection.cursor() +print("CURSOR", cursor) + +total_char = "SELECT count(character_id) FROM charactercreator_character" +no_clerics = "SELECT COUNT() FROM charactercreator_cleric" +no_fighters = "SELECT COUNT() FROM charactercreator_fighter" +no_mages = "SELECT COUNT() FROM charactercreator_mage" +no_necro = "SELECT COUNT() FROM charactercreator_necromancer" +no_thief = "SELECT COUNT() FROM charactercreator_thief" +total_items = "SELECT (select COUNT(item_id) FROM armory_item) + (select COUNT(item_ptr_id) FROM armory_weapon) AS Total_Items" +item_count = "SELECT COUNT() FROM armory_weapon" +char_item = 'SELECT character_id, count(item_id) FROM charactercreator_character_inventory GROUP BY character_id LIMIT 20' +char_wpn = 'SELECT character_id, count(item_id) FROM charactercreator_character_inventory LEFT JOIN armory_weapon ON item_id = item_ptr_id GROUP BY character_id LIMIT 20' +avg_char_wpn = "SELECT character_id, COUNT(item_id) as 'No_of_Items',ROUND(AVG(item_id)) FROM charactercreator_character_inventory GROUP BY character_id ORDER BY character_id LIMIT 20" +avg_char_item = "SELECT character_id, count(item_id), round(avg(item_ptr_id)) FROM charactercreator_character_inventory LEFT JOIN armory_weapon ON item_id = item_ptr_id GROUP BY character_id LIMIT 20" + +queries = [total_char, no_clerics, no_fighters, no_mages, no_necro, no_thief, + total_items, item_count, char_item, char_wpn, avg_char_item, avg_char_wpn] + +for query in queries: + result = cursor.execute(query).fetchall() + print('Result :', result[0]) \ No newline at end of file From 8b14f42302b7c40c1d48656c6ad8f29feba793b4 Mon Sep 17 00:00:00 2001 From: RAV10K1 Date: Mon, 25 May 2020 14:41:02 -0700 Subject: [PATCH 05/11] changed env variables --- module2-sql-for-analysis/.gitignore | 1 + module2-sql-for-analysis/Pipfile | 13 ++++ module2-sql-for-analysis/Pipfile.lock | 65 ++++++++++++++++++++ module2-sql-for-analysis/elephant_queries.py | 23 +++++++ module2-sql-for-analysis/insert_titanic.py | 0 module2-sql-for-analysis/rpg_queries.py | 0 6 files changed, 102 insertions(+) create mode 100644 module2-sql-for-analysis/.gitignore create mode 100644 module2-sql-for-analysis/Pipfile create mode 100644 module2-sql-for-analysis/Pipfile.lock create mode 100644 module2-sql-for-analysis/elephant_queries.py create mode 100644 module2-sql-for-analysis/insert_titanic.py create mode 100644 module2-sql-for-analysis/rpg_queries.py diff --git a/module2-sql-for-analysis/.gitignore b/module2-sql-for-analysis/.gitignore new file mode 100644 index 00000000..2eea525d --- /dev/null +++ b/module2-sql-for-analysis/.gitignore @@ -0,0 +1 @@ +.env \ No newline at end of file diff --git a/module2-sql-for-analysis/Pipfile b/module2-sql-for-analysis/Pipfile new file mode 100644 index 00000000..af9e4fc4 --- /dev/null +++ b/module2-sql-for-analysis/Pipfile @@ -0,0 +1,13 @@ +[[source]] +name = "pypi" +url = "https://pypi.org/simple" +verify_ssl = true + +[dev-packages] + +[packages] +python-dotenv = "*" +psycopg2-binary = "*" + +[requires] +python_version = "3.7" diff --git a/module2-sql-for-analysis/Pipfile.lock b/module2-sql-for-analysis/Pipfile.lock new file mode 100644 index 00000000..33c0c595 --- /dev/null +++ b/module2-sql-for-analysis/Pipfile.lock @@ -0,0 +1,65 @@ +{ + "_meta": { + "hash": { + "sha256": "a752871a27baa56670a0b6819d9ceb382c45d6b85b7582cf470086535ebba601" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.7" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "psycopg2-binary": { + "hashes": [ + "sha256:008da3ab51adc70a5f1cfbbe5db3a22607ab030eb44bcecf517ad11a0c2b3cac", + "sha256:07cf82c870ec2d2ce94d18e70c13323c89f2f2a2628cbf1feee700630be2519a", + "sha256:08507efbe532029adee21b8d4c999170a83760d38249936038bd0602327029b5", + "sha256:107d9be3b614e52a192719c6bf32e8813030020ea1d1215daa86ded9a24d8b04", + "sha256:17a0ea0b0eabf07035e5e0d520dabc7950aeb15a17c6d36128ba99b2721b25b1", + "sha256:3286541b9d85a340ee4ed42732d15fc1bb441dc500c97243a768154ab8505bb5", + "sha256:3939cf75fc89c5e9ed836e228c4a63604dff95ad19aed2bbf71d5d04c15ed5ce", + "sha256:40abc319f7f26c042a11658bf3dd3b0b3bceccf883ec1c565d5c909a90204434", + "sha256:51f7823f1b087d2020d8e8c9e6687473d3d239ba9afc162d9b2ab6e80b53f9f9", + "sha256:6bb2dd006a46a4a4ce95201f836194eb6a1e863f69ee5bab506673e0ca767057", + "sha256:702f09d8f77dc4794651f650828791af82f7c2efd8c91ae79e3d9fe4bb7d4c98", + "sha256:7036ccf715925251fac969f4da9ad37e4b7e211b1e920860148a10c0de963522", + "sha256:7b832d76cc65c092abd9505cc670c4e3421fd136fb6ea5b94efbe4c146572505", + "sha256:8f74e631b67482d504d7e9cf364071fc5d54c28e79a093ff402d5f8f81e23bfa", + "sha256:930315ac53dc65cbf52ab6b6d27422611f5fb461d763c531db229c7e1af6c0b3", + "sha256:96d3038f5bd061401996614f65d27a4ecb62d843eb4f48e212e6d129171a721f", + "sha256:a20299ee0ea2f9cca494396ac472d6e636745652a64a418b39522c120fd0a0a4", + "sha256:a34826d6465c2e2bbe9d0605f944f19d2480589f89863ed5f091943be27c9de4", + "sha256:a69970ee896e21db4c57e398646af9edc71c003bc52a3cc77fb150240fefd266", + "sha256:b9a8b391c2b0321e0cd7ec6b4cfcc3dd6349347bd1207d48bcb752aa6c553a66", + "sha256:ba13346ff6d3eb2dca0b6fa0d8a9d999eff3dcd9b55f3a890f12b0b6362b2b38", + "sha256:bb0608694a91db1e230b4a314e8ed00ad07ed0c518f9a69b83af2717e31291a3", + "sha256:c8830b7d5f16fd79d39b21e3d94f247219036b29b30c8270314c46bf8b732389", + "sha256:cac918cd7c4c498a60f5d2a61d4f0a6091c2c9490d81bc805c963444032d0dab", + "sha256:cc30cb900f42c8a246e2cb76539d9726f407330bc244ca7729c41a44e8d807fb", + "sha256:ccdc6a87f32b491129ada4b87a43b1895cf2c20fdb7f98ad979647506ffc41b6", + "sha256:d1a8b01f6a964fec702d6b6dac1f91f2b9f9fe41b310cbb16c7ef1fac82df06d", + "sha256:e004db88e5a75e5fdab1620fb9f90c9598c2a195a594225ac4ed2a6f1c23e162", + "sha256:eb2f43ae3037f1ef5e19339c41cf56947021ac892f668765cd65f8ab9814192e", + "sha256:fa466306fcf6b39b8a61d003123d442b23707d635a5cb05ac4e1b62cc79105cd" + ], + "index": "pypi", + "version": "==2.8.5" + }, + "python-dotenv": { + "hashes": [ + "sha256:25c0ff1a3e12f4bde8d592cc254ab075cfe734fc5dd989036716fd17ee7e5ec7", + "sha256:3b9909bc96b0edc6b01586e1eed05e71174ef4e04c71da5786370cebea53ad74" + ], + "index": "pypi", + "version": "==0.13.0" + } + }, + "develop": {} +} diff --git a/module2-sql-for-analysis/elephant_queries.py b/module2-sql-for-analysis/elephant_queries.py new file mode 100644 index 00000000..5a349012 --- /dev/null +++ b/module2-sql-for-analysis/elephant_queries.py @@ -0,0 +1,23 @@ +import psycopg2 +import os +from psycopg2.extras import DictCursor +from dotenv import load_dotenv + +load_dotenv() + +DB_NAME = os.getenv('DB_NAME', default='Check env variables') +DB_USER = os.getenv('DB_USER', default='Check env variables') +DB_PASSWORD = os.getenv('DB_PASSWORD', default='Check env variables') +DB_HOST = os.getenv('DB_HOST', default='Check env variables') + +connection = psycopg2.connect(dbname = DB_NAME, user = DB_USER, + password = DB_PASSWORD, host = DB_HOST) +print("CONNECTION:", connection) + +cursor = connection.cursor(cursor_factory=psycopg2.extras.DictCursor) +print("CURSOR:", cursor) + +cursor.execute('SELECT * from test_table;') +result = cursor.fetchall() +print("RESULT:", type(result)) +print(result) \ No newline at end of file diff --git a/module2-sql-for-analysis/insert_titanic.py b/module2-sql-for-analysis/insert_titanic.py new file mode 100644 index 00000000..e69de29b diff --git a/module2-sql-for-analysis/rpg_queries.py b/module2-sql-for-analysis/rpg_queries.py new file mode 100644 index 00000000..e69de29b From b8633cc41d2f9958f48ce0618a5659fa76576ae8 Mon Sep 17 00:00:00 2001 From: RAV10K1 Date: Mon, 25 May 2020 16:45:26 -0700 Subject: [PATCH 06/11] reproduced lecture --- module2-sql-for-analysis/elephant_queries.py | 70 ++++++++++++++- module2-sql-for-analysis/rpg_db.sqlite3 | Bin 0 -> 253952 bytes module2-sql-for-analysis/rpg_queries.py | 90 +++++++++++++++++++ 3 files changed, 159 insertions(+), 1 deletion(-) create mode 100644 module2-sql-for-analysis/rpg_db.sqlite3 diff --git a/module2-sql-for-analysis/elephant_queries.py b/module2-sql-for-analysis/elephant_queries.py index 5a349012..1ce5f307 100644 --- a/module2-sql-for-analysis/elephant_queries.py +++ b/module2-sql-for-analysis/elephant_queries.py @@ -1,4 +1,7 @@ import psycopg2 +from psycopg2.extras import execute_values +import json +import pandas as pd import os from psycopg2.extras import DictCursor from dotenv import load_dotenv @@ -20,4 +23,69 @@ cursor.execute('SELECT * from test_table;') result = cursor.fetchall() print("RESULT:", type(result)) -print(result) \ No newline at end of file +print(result) + + +table_name = "test_table2" + +print("-------------------") +query = f""" +CREATE TABLE IF NOT EXISTS {table_name} ( + id SERIAL PRIMARY KEY, + name varchar(40) NOT NULL, + data JSONB +); +""" +print("SQL:", query) +cursor.execute(query) + +# +# INSERT SOME DATA +# + +my_dict = { "a": 1, "b": ["dog", "cat", 42], "c": 'true' } + +#insertion_query = f"INSERT INTO {table_name} (name, data) VALUES (%s, %s)" +#cursor.execute(insertion_query, +# ('A rowwwww', 'null') +#) +#cursor.execute(insertion_query, +# ('Another row, with JSONNNNN', json.dumps(my_dict)) +#) + +# h/t: https://stackoverflow.com/questions/8134602/psycopg2-insert-multiple-rows-with-one-query +insertion_query = f"INSERT INTO {table_name} (name, data) VALUES %s" +#execute_values(cursor, insertion_query, [ +# ('A rowwwww', 'null'), +# ('Another row, with JSONNNNN', json.dumps(my_dict)), +# ('Third row', "3") +#]) + +df = pd.DataFrame([ + ['A rowwwww', 'null'], + ['Another row, with JSONNNNN', json.dumps(my_dict)], + ['Third row', "null"], + ["Pandas Row", "null"] +]) + +records = df.to_dict("records") #> [{0: 'A rowwwww', 1: 'null'}, {0: 'Another row, with JSONNNNN', 1: '{"a": 1, "b": ["dog", "cat", 42], "c": "true"}'}, {0: 'Third row', 1: '3'}, {0: 'Pandas Row', 1: 'YOOO!'}] +list_of_tuples = [(r[0], r[1]) for r in records] + +execute_values(cursor, insertion_query, list_of_tuples) + +# +# QUERY THE TABLE +# + +print("-------------------") +query = f"SELECT * FROM {table_name};" +print("SQL:", query) +cursor.execute(query) +for row in cursor.fetchall(): + print(row) + +# ACTUALLY SAVE THE TRANSACTIONS +connection.commit() + +cursor.close() +connection.close() \ No newline at end of file diff --git a/module2-sql-for-analysis/rpg_db.sqlite3 b/module2-sql-for-analysis/rpg_db.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..837d7f16116f34e53935a4560c69acb17766b29d GIT binary patch literal 253952 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 [{0: 'A rowwwww', 1: 'null'}, {0: 'Another row, with JSONNNNN', 1: '{"a": 1, "b": ["dog", "cat", 42], "c": "true"}'}, {0: 'Third row', 1: '3'}, {0: 'Pandas Row', 1: 'YOOO!'}] +list_of_tuples = [(r[0], r[1]) for r in records] + +execute_values(cursor, insertion_query, list_of_tuples) + +# +# QUERY THE TABLE +# + +print("-------------------") +query = f"SELECT * FROM {table_name};" +print("SQL:", query) +cursor.execute(query) +for row in cursor.fetchall(): + print(row) + +# ACTUALLY SAVE THE TRANSACTIONS +connection.commit() + +cursor.close() +connection.close() \ No newline at end of file From c622846061ef4c952232d7d77f8c96c1cdd50ec6 Mon Sep 17 00:00:00 2001 From: RAV10K1 Date: Wed, 27 May 2020 12:02:45 -0700 Subject: [PATCH 07/11] added titanic query --- module2-sql-for-analysis/insert_titanic.py | 49 ++++++++++++++++++++++ module2-sql-for-analysis/rpg_queries.py | 2 +- 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/module2-sql-for-analysis/insert_titanic.py b/module2-sql-for-analysis/insert_titanic.py index e69de29b..ab481b77 100644 --- a/module2-sql-for-analysis/insert_titanic.py +++ b/module2-sql-for-analysis/insert_titanic.py @@ -0,0 +1,49 @@ +import psycopg2 +from psycopg2.extras import execute_values +import json +import pandas as pd +import os +from psycopg2.extras import DictCursor +from dotenv import load_dotenv + +load_dotenv() + +# Loading csv to pandas dataframe +file_path = os.path.join(os.path.dirname(__file__), 'titanic.csv') +df = pd.read_csv(file_path) +print(df.shape) +print(df.head()) + +# Establishing connection and cursor to ElephantSQL + +DB_NAME = os.getenv('DB_NAME2', default='Check env variables') +DB_USER = os.getenv('DB_USER2', default='Check env variables') +DB_PASSWORD = os.getenv('DB_PASSWORD2', default='Check env variables') +DB_HOST = os.getenv('DB_HOST2', default='Check env variables') + +connection = psycopg2.connect( + dbname = DB_NAME, + user = DB_USER, + password = DB_PASSWORD, + host = DB_HOST) +print('CONNECTION :', connection) + +cursor = connection.cursor() + +cursor.execute('DROP TABLE IF EXISTS titanic;') + +# Creating table with query + +table_query = 'CREATE TABLE titanic(Survived INT, Pclass INT, Name varchar(150), Sex varchar(10), Age INT, SiblingsSpouse INT, ParentsChildren INT, Fare INT);' + +cursor.execute(table_query) + +# Copying .csv file data into new table with query + +import_query = "COPY titanic FROM 'titanic.csv' DELIMITER ',' CSV HEADER;" + +cursor.execute(import_query) + +connection.commit() + +cursor.execute('SELECT * FROM titanic') diff --git a/module2-sql-for-analysis/rpg_queries.py b/module2-sql-for-analysis/rpg_queries.py index 166dc0d7..5eb34543 100644 --- a/module2-sql-for-analysis/rpg_queries.py +++ b/module2-sql-for-analysis/rpg_queries.py @@ -42,7 +42,7 @@ # INSERT SOME DATA # -my_dict = { "a": 1, "b": ["dog", "cat", 42], "c": 'true' } +# my_dict = { "a": 1, "b": ["dog", "cat", 42], "c": 'true' } #insertion_query = f"INSERT INTO {table_name} (name, data) VALUES (%s, %s)" #cursor.execute(insertion_query, From a1f234037d8feec39e7da128ebc69ed071e3c5dc Mon Sep 17 00:00:00 2001 From: RAV10K1 Date: Thu, 28 May 2020 18:26:14 -0700 Subject: [PATCH 08/11] completed --- .../.vscode/settings.json | 3 + module2-sql-for-analysis/Pipfile | 1 + module2-sql-for-analysis/Pipfile.lock | 115 +++++++++++++++++- module2-sql-for-analysis/insert_titanic.py | 33 ++--- 4 files changed, 125 insertions(+), 27 deletions(-) create mode 100644 module2-sql-for-analysis/.vscode/settings.json diff --git a/module2-sql-for-analysis/.vscode/settings.json b/module2-sql-for-analysis/.vscode/settings.json new file mode 100644 index 00000000..00b8b8cc --- /dev/null +++ b/module2-sql-for-analysis/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "python.pythonPath": "C:\\Users\\Ravi\\.virtualenvs\\DS-Unit-3-Sprint-2-SQL-and-Databases-kzZYgH90\\Scripts\\python.exe" +} \ No newline at end of file diff --git a/module2-sql-for-analysis/Pipfile b/module2-sql-for-analysis/Pipfile index af9e4fc4..f15c1e36 100644 --- a/module2-sql-for-analysis/Pipfile +++ b/module2-sql-for-analysis/Pipfile @@ -4,6 +4,7 @@ url = "https://pypi.org/simple" verify_ssl = true [dev-packages] +pylint = "*" [packages] python-dotenv = "*" diff --git a/module2-sql-for-analysis/Pipfile.lock b/module2-sql-for-analysis/Pipfile.lock index 33c0c595..fa5d5cd9 100644 --- a/module2-sql-for-analysis/Pipfile.lock +++ b/module2-sql-for-analysis/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "a752871a27baa56670a0b6819d9ceb382c45d6b85b7582cf470086535ebba601" + "sha256": "8652f92934fef2f87ef05d7ee94fc1884ce7b21c2f873181567b844991c22317" }, "pipfile-spec": 6, "requires": { @@ -61,5 +61,116 @@ "version": "==0.13.0" } }, - "develop": {} + "develop": { + "astroid": { + "hashes": [ + "sha256:4c17cea3e592c21b6e222f673868961bad77e1f985cb1694ed077475a89229c1", + "sha256:d8506842a3faf734b81599c8b98dcc423de863adcc1999248480b18bd31a0f38" + ], + "version": "==2.4.1" + }, + "colorama": { + "hashes": [ + "sha256:7d73d2a99753107a36ac6b455ee49046802e59d9d076ef8e47b61499fa29afff", + "sha256:e96da0d330793e2cb9485e9ddfd918d456036c7149416295932478192f4436a1" + ], + "markers": "sys_platform == 'win32'", + "version": "==0.4.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:b95e31850f3af163c2283ed40432f053acbc8fc6eba6a069cb518d9dbf71848c", + "sha256:dd506acce0427e9e08fb87274bcaa953d38b50a58207170dbf5b36cf3e16957b" + ], + "index": "pypi", + "version": "==2.5.2" + }, + "six": { + "hashes": [ + "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259", + "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced" + ], + "version": "==1.15.0" + }, + "toml": { + "hashes": [ + "sha256:926b612be1e5ce0634a2ca03470f95169cf16f939018233a670519cb4ac58b0f", + "sha256:bda89d5935c2eac546d648028b9901107a595863cb36bae0c73ac804a9b4ce88" + ], + "version": "==0.10.1" + }, + "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:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7" + ], + "version": "==1.12.1" + } + } } diff --git a/module2-sql-for-analysis/insert_titanic.py b/module2-sql-for-analysis/insert_titanic.py index ab481b77..744cf6a0 100644 --- a/module2-sql-for-analysis/insert_titanic.py +++ b/module2-sql-for-analysis/insert_titanic.py @@ -1,9 +1,9 @@ import psycopg2 -from psycopg2.extras import execute_values +from sqlalchemy import create_engine import json import pandas as pd import os -from psycopg2.extras import DictCursor + from dotenv import load_dotenv load_dotenv() @@ -14,36 +14,19 @@ print(df.shape) print(df.head()) -# Establishing connection and cursor to ElephantSQL +# Establishing connection and cursor to PostgreSQL DB_NAME = os.getenv('DB_NAME2', default='Check env variables') DB_USER = os.getenv('DB_USER2', default='Check env variables') DB_PASSWORD = os.getenv('DB_PASSWORD2', default='Check env variables') DB_HOST = os.getenv('DB_HOST2', default='Check env variables') -connection = psycopg2.connect( - dbname = DB_NAME, - user = DB_USER, - password = DB_PASSWORD, - host = DB_HOST) -print('CONNECTION :', connection) - -cursor = connection.cursor() - -cursor.execute('DROP TABLE IF EXISTS titanic;') - -# Creating table with query - -table_query = 'CREATE TABLE titanic(Survived INT, Pclass INT, Name varchar(150), Sex varchar(10), Age INT, SiblingsSpouse INT, ParentsChildren INT, Fare INT);' - -cursor.execute(table_query) - -# Copying .csv file data into new table with query +sql_url = f'postgresql://{DB_USER}:{DB_PASSWORD}@{DB_HOST}/{DB_NAME}' -import_query = "COPY titanic FROM 'titanic.csv' DELIMITER ',' CSV HEADER;" +engine = create_engine(sql_url) -cursor.execute(import_query) +print('ENGINE :', engine) -connection.commit() +# Inserting DF data to table -cursor.execute('SELECT * FROM titanic') +df.to_sql('titanic', engine, if_exists='replace') From 9c8891cfbb22d8a5eb8478bbf2a3bb2803690c9c Mon Sep 17 00:00:00 2001 From: RAV10K1 Date: Sun, 31 May 2020 20:22:33 -0700 Subject: [PATCH 09/11] answered questions --- .../insert_rpg.py | 13 +++++++++++++ .../rpg_db.sqlite3 | Bin 0 -> 253952 bytes 2 files changed, 13 insertions(+) create mode 100644 module3-nosql-and-document-oriented-databases/insert_rpg.py create mode 100644 module3-nosql-and-document-oriented-databases/rpg_db.sqlite3 diff --git a/module3-nosql-and-document-oriented-databases/insert_rpg.py b/module3-nosql-and-document-oriented-databases/insert_rpg.py new file mode 100644 index 00000000..57dc21f0 --- /dev/null +++ b/module3-nosql-and-document-oriented-databases/insert_rpg.py @@ -0,0 +1,13 @@ +import os +import sqlite3 as sq + +# Defining file paths +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +DB_FILEPATH = os.path.join(BASE_DIR, 'rpg_db.sqlite3') + +connection = sq.connect(DB_FILEPATH) +print("CONNECTION : ", connection) + +cursor = connection.cursor() +print("CURSOR : ", cursor) + diff --git a/module3-nosql-and-document-oriented-databases/rpg_db.sqlite3 b/module3-nosql-and-document-oriented-databases/rpg_db.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..837d7f16116f34e53935a4560c69acb17766b29d GIT binary patch literal 253952 zcmeEv2YejG+5XJl?#^D>UCXj8H`yo2vMtN9RjlTQWm_(|_X^@9t>v??$ag0f`mRs( z(0etV&_hoMH6aj4A%P?W@&PF%kOBnwl90fc|2yR*xq<(D$;SuZ`1kX^&%HA{<(b*% z_T8P)tz5n+nsLILlc{(l6Rt%A5XNX`IE)Z#g8wt%f9_ug05$gkEbfO71)I=BZI%Y9 ziv1UwXRQ4X4i0sK^h*XL1CjyBfMh^2AQ_MhNCqSWk^#wpWI!_TFJz#w778mEZo)Ay zcptK#wlB6j>|*O}>jrCsRbakgo?|Ww{WJ7nC=sd-egs+MKgob(Kr$d1kPJu$Bm+5T3=UEymSltYb+yb>VwMJsl{MPO?9Ac4lrZo|X zJFW4^uGW~7=*(<6SSxB98yagT&o!Z-mAQf%`xit@JDhUrsvBzS7lxpmqjKdmh;nvB zV$lvtX}UGi(b4LpQpr?n9B7JkI_ZNps=BJauCX}?g)PVxR^OU(ws%KUPHTHIk#Q24 z%F8Z-+D3)wK;ZO||oN4VBGn?oT6|>nSIm+|f&KE9I9JdN6vcVRBd3R%;p>TGkv% z#gnPspElpCs_PqT8=6%O6#|wBz6yOfd;Md6~p3vApujB>{6v0*5Z>D{6_v$A$!fdIpHtj{o zuo1G~vR|}svLCZgw2>XNi$4chlT}IvBm)RDHF$V{0VQnan*+Vvjqle9c#ZSpj_yR>tQmzDh&nW)B@&;h9AN z_D#wa5s!AJA{qM3FE0QUTGqqJe%n6Ij@m!6AF*GzkF-9teqmQx58DOyUi-|0w@G>> z1CjyBfMh^2AQ_MhNCqSWk^#wpWI!_TKf*v*tt`d8k-As}lW^Ko$#^8u?xd^{YUS_) zGHi}^Zh=K7=5V!g=mClCF((ym4-Hc*3lB)kY>7IXgG1HIf&-G`ur4GpQmq_yKuT}( z{CVoop_m8%JDo^ZGGW;2&;sG1PXovxwP-lbEyfX6AEA~(C;PqD?}xQ~wV;?q|9!!~ zYN-W<%-5Mpc6a$qwE!xCCk%Ayhmxlj7WvsDf!rzvy8hp?zJcsN*{|8p+uyXWvCpuN zwYS&{>`C?@>u=U8kSPC21|$QL0m*=5Kr$d1kPJu$Bms;Hot2KRmOzv%;CA@#BNKcv9N zf?WKchgDQqv`_p`-~W#fJ%;Re?3eAQ><8={?DK8UPTHI7dGG|F(8kuA)(@>mtXr%L ztgMx?j8hp+ARSfEMR)#1dP4D9{xd-pq@CqVd>=-elvygDSY z+)*-6#br1sPGsR_F?Wgcm@90ncoYuO)7a-xtN{UW7L7bda*sHP#iEvqi*SIRLqCof ztl~=S&$Tf3XCsDlcdn5+_b}FWcuNfJ%=v~gpCL-%@2`h&pE#ZS3RxcwdMlH6aE~~RdIqu95_%GggBk6*I7P(61G!V2C7gMzD4m`tJOkLUYq_5Gy*9Ubf;hil z3~jObpt0WeWj6~|JPE6!oWAHf#Qma}K7WukPo<^wIRk7keWDN+j{CVwoX=da3;@R0 zM^9y+3G0+1&Z2Mab?y--QIEzLQ|LMLqdG|SS732Q?!~^3ImJmir!qkGm$9MEdFcCp z_@n>wpJYHXAQ_MhNCqSWk^#wpWI!??8ITM}1|$PtVg~5@e;NOOi3eDAO)?-EkPJu$ zBm;L5(kPJu$Bm^P1d&9Uq_ zh8@f3F*KSTOWCo69)rc~7-q*&^cWb)jz#P^f*$?D*>M;<4y8w92s;+C<6wFu1?)J8 z9rNi?AIOe*>^OiPHJcqRb~Ncx4Y6a89Ru{}^RuJDj)Wc+ogFoHR8^lJ`{+UO`TTwj z#zC<^prbL({yPW%%Z5faM=~H8kPJu$Bmf2MIh`3Wh|J?)R` z2Wpcq23cM~^S?+v`y#b=lS{(mN}?Sl;b>%$9M)`y!{ zuUfib2^6%rWyz`u;gV$AR;NAFO3%wUyE5#AK6lFLN|l6nL{jZrBB^mTRaND^r9!4i zdnTGpv~G??I!nUocqA5ss>9uhbhI&rzbj{*0_^SM>?HcRib@RQhO5GoXE6h zc6T|fExmo9?O)L{w`E1klG!aQdpq6#1kvyE@En?N1tVv{k_D?4G%s4TUN~FkKrP*A zC$(?sIfnYz5b4frX{A{YyIjFTCK`vXbwn}_MZMiGcaJP2g~?{@ZjUB9oL#-;vr1aK zoK!rTP6LtYei)kBTD`fgt!{Ho`=L)5CMLv!C39NV!Fc3aez+x{xqh9WI7Z`=EzZrWKhuijj zI^SA7Ia1$NUt81KorrEfba#e`?yO$2VEO8nFdv*lXXk?j z@&}Q^<(1g2+ppW5sbqIox|JC^;hGxi>YC~%Pws0g&oTH=<8!D2_8%6WkItrCUC^ol z`J`|uw5s~xt;!8`eWbd^>1gaXeRyeuKBZCnpMU5!<(MmXrw=5B+n`CwPi|7K6Rk~? zYwN1otJ?RQ5WIo;pF9nCrryCnc$xc+J3oi=m}@hPcJ54|bV?p6>}^UH7-v#^$we-!T1J2*)x;#)mymcW`*xZb>Q`t>QpE$5N*jHux&?%8>4=N^3S0|(a4kk zSCPkO+2QfV@*XZ_OAJ!j)P%DQeU$OK`q<~h9pLpJguVkZeI^olDgW}$9&j!GJLX_5 z(F^AlW5i@Ey*(DqIIVDj@~=ROwg`Qx?!$&VKqrO8#n|1p-zfCuA%|l7GclZq(0l7# zAkx?`4hi$ytny`wURY6q*RuwRex#l4-ASD~Qq24t_co(!Dnf7p1( z7^DA}K3?17`4XRD)f?EuoJ-Tlw-V$$(_wzsEpzjb7L?>Jy*LvR5Dc!7PQr zJ>}J;aMUP#N^#$FS(?Be%Tf^7_Yq~U|1&+B?24q*JCiARz?ge5TV2z*&-2MxB%Prv zS)z&l4l>DI2SD{kY^?jSQ zPY=r7(PQ9+XT?4*Jp0~ZwDw=&Lf;wIY@Xau?@Z?J!Ta)AVnF*Z0qILUWGVgLboS+@ zlVHDU;Z5iAGE%s^0(-%}7oB~l98f`fvcsXhZmp`0wAD7$Mf%=x_MN4RMjyCBqA$;3 zmfZJVv+vY{^#evE*R+yyuWU4-FAK7`?=tB-om~`tAHxT^WcpG+(}lA?$)EgQN4#g~ zf0C&6Q{FH3?{nWJy5AzMeW&O?uMo=JxuvjjsTR9C+1MYXA+7L^p*0q1b7HM=82MOh zLw#FEZAWbz8}@^opdM`K50dYb3udE!kh3T+y)7z%{{85FLd~)H0@C39J-17ol#OQ z-~S)pER(q;1CjyBfMh^2AQ_MhNCqSWk^#wpWI!_TMP@+8|6k^Pns%h_=pJC0??G3;2zj-%PJlpRahv6vmh>^O=YN3vrPJC0z- z;p{k!9fz{x5OyqN$HDAaz>b61F`pd=vSS`Q4q!){9W8b=*)hb9L3Rwlk;eby{ZAu^ z`tO10K4u>YF?_)Kt@WgJxfQc!So!9!%&(c}n4RVkW~qrouZ129T^34*7Ke(1{~7#w z@WJ3k!JWaC!AU_o@K)ekfolW11Iq(r{eOi*ilOte<LVjypz{K(6BQ5Us5*3$2WQDk+BavdW;SE3+l) zZ0=VT`&<&{c|=XUc|=9*^N3N9XVlmrt*18wt%iLFkA&3Hih!sk9_e)YRYE_8i+B!E zM=pn`f_@w}0&*0U1!xVqWLg2mdEC0wa|~l@*zi28KHILl4%VTj~NJQ z<<+_@%GSTY9$4NHisGh3j#x9x2IEhSV zcUS)@($2kM>Yilr6GYV_DR+XXzW)j3CY(@Fr_na-mz%buf7S^h$U3P(6^-d~Qt{~i z4D>lC1bJ@JlD>p~bE(fcCIGq1t5w>JK5uR|^?6GCkgu%LC)&`NN_Kbk8)Npl#Nc^E z&AoX<@7d=O1oDg;>!bDcW}qErAHq7MmR2aDmhSXEnnpi{HJ(G%k;@^fpdW{+kfW$f zp*7@^X$2II^J&OmQ74LzB|BkIQ@i{116*O|8>g_GqMH6WMOD2yOEBatn?$SYpN&@8 zn}^2#bF9(G{?LBU{)7D+`#<3A{}1hF>?iDR*!RM_{~PVA?Mv))?bG4S|8aK4j@z5< zR(S8f9G(=+wx`*3@Ya8<9kz$s1MQ%#S|3|~vEH%Xw0>#5Y`tK8&w9#w)Oygm+xn_? zopptEq4gE(6ze2wm$lv6YPDONtku>MYo0aJYO-pq3TTM@CmE0oNCqSWk^#wpWI!?? z8ITM}1|$QY8w1)L6&bigo6XHEZkoB7$;}bm%;07^H`BP8%FPsRnz(7?rh%J!ZtA$1 z%uOvfHQZElQ^n0BZYFY5$;||AD!3WXO*uE?xEagM7;ehA8O=>8HznK@a}(xf6gMNe zDdJ`XH^aFZ#?4S}hHz8J&0uZ{xEaJvJ~soo$>U}KH#RpGHzqeBZi3tdxbbsia6`D! zxzV^$x$$wMaD$nl@qewg1=)YI--XrxuiG!d+W%+l$6@9F-S#c8?*CGV{ZF$`ws*mr z|1I`05cw~&=fiscM!O1D3WV(;_5jE!1hFh z?THZE6EU_Yf^1Jj*`5fqJrQSnBGC3kr0t1N+Y_<2CxUHHMBAPSw>=SWdm`ZWM8xfh zklPb6wWz6n2NO-NI&sO$(b6c002){*Q%T`Mlo$Z?slg3$5AKRI3)= z{+C+At$ZtJ`OJTq@0))xe{H^EzF;h1bN)!h2$BUGdq? zeTLAM`60Ar7D8KQA+%){LR)4bv}G1TTV^4&WfnqPW+Aj?7D8KQA+%){LR)4bv}G1T zTV^4&WfnqPW+Aj?7D8KQA+%){LR)4bv}G1TTV^4&WfnqPW+Aj?7D8KQA+%){LR)4b zv}G1TTV^4&WfnqPW+Aj?7D8KQA+)6yB3o)8u%!m#T52Gyr3Ru}Y9Oek24Y%jAf%-R zB3f!7prr=lS!y7hr3Ru|Y9N@U24Y!iy0}Slli()KO^lmu+-&70%FPyTI=R`*jl)d` zH|^ZCaTDR@7;aj*IhvcJxY@+bMs7B6v!0uE+^pqh4L7T~S;fstZdP!!oSS9bEahei zH;cJh#LYr(j^t(mH}kof$IV=BT9~2n|K)f(vVUp+4Bq?SY@ctRU~h*N{)_Aydl+ z$cMif@P_|+|0DjJ{pa{k^hf+_{geHL#>d7>#&?YCj6FuTvC(KU29tl1-;k%t9pqxN zlWZdk$uv?#u>QLKBmG|eZ2dU>Xnm1BUe~n`v>$4BY3FMvXzR2Y+6XP6zN>yuy-&SC z-J@<**Q<-viE7CAJKxK`@Az)@UE{mZx7)YgH_un*^C^E(UQr%Zu2YUzj#j2A6ORDoeEh{d`Gy0GVItYIvUbS9$VOfmzx zw-0q;i&Guc(H-lGgxkC0+q)eoEg9b7#6m7?ZyIhGE1WJT7K@B)9q2{NS+Hjmda?? zL|L1=J53jMClwjSoG7#pw)u>5VJ}iMZ+jd%P0Nd9=rQHAcc&wXj^QqBK58_QN)%AujA7s%2eB0S(b`8q#5OfWv?bn}!Mv zV+o~mlnc9qpc`{p0bP+)G(yL5hm%SQI!3v$Hwbd@F^IIY&Sj!7#-h>=+lBo>#W^Y{ zwM8!M2byjei=u6`pmYSrDBSPVAuj9&g4QjCmL++A9oSMvNi?Gr8|YYHB?PI#U~gY#7H=iY>STC#mJo%g9#JOL}A{x=O&%A z%Sp9It(_VgWf-%ZNG9UIxD4K*p-C_e=^Sx#LjcT`bZclH)Ie+7)$Vk`C`Q9wF_`Ya zQ6vpp#uAYs8OAz{HB|1j)BSpxNQTa|0cj1D!eoqeMPZ*6WiXs#e6#>(sj$O%gbCJ_ z?vBG1yo+);WIHRZnazke%vRoDD6zDQ5f0rKmp$Ftm4NO+zawdA7QG_#lkCc4vk)51 zC;#vSyJY6%@~3;pG}+cZGOnQ`ppkTjvung*dXT%`BBe1t&Q5AGT;sqeTrz!x1AFwO z0ozzl;nL>UMWm}_D`Tz&3hi!>(vAqBiF9Yez+1X2+8&NFHrC{ZJRXkmiNZ`YnT`zD z!pdEoj5%qQ8V1HmnC(oXgvf0l)y5`QGrcOJ9pMPIKs9I)6r6HW-NPbGL7HI` zGZh0!>xi~zKxskKi;iKJ@a$wfp6rOiHfq?YN0|rZj>052TUk}?dV&6rJerLSzo4Vt zX}EBDsiA`#IErfys7tzN6Dzp|dPY?-SFo6*nSzZPs-%(!WJY#Mdo`Y2e-Dw+?&+m(cC zfet-nDPF_AxY!lOR5$`(STJe%On@PTcCBX90f>d~mwx?B=dK@T$ST%a_T>n>i>anM z>{3dGRuHU?T8M85=Z@eRacxhzJ3pl;_Q5SI}a{0}MLc1mw3cN#QP-q|m4x z$pLc&Jzd=$QBc{4Gi)~h-elj|2`A2OCt$8nNgO^)v{)!NNI-jcR}{24l5vJM_k9Vq z^(l5DnaPK|XEz8)el2aD_26j|0! zhoP@I_F2aYCbQD})RKO|MB;&3rV-Ml#lJh_5#H)VH{7LK<^8|SJCY^i7@d9J zp+HnW^=hNv`uSs7h5TLy^q1Yhm}A)Ff`+o}1!auS{*=RgL~7({{*B27J13d!29I^$ z36`>(mX++wW?%`MVJ*;SrV#L*kc(v&ZX%UJ=mB-od#6Yn{dR*(pq+;txtp=g-9sQ0fzx|$k#gUd+q(xsAOevKjdbXj zDrjpeH4vf^@No&|*ZU3&LJ+u>gK0)D(6;1Ah&|wbrvG5z8Wlfe?N`6V|XRi;HO@1VIPHOyas50>K4zsh?=& z?xhApXaRSbEmRBW9j*9ci3|y_GnVDzge~;eC=EA^@jM7BAY=l);AfJ`DF4$uOVm5H~PqvZL>&a})#%5P*RGi`z-oq~7}m zCt^a#07S719_~d9g}x`edS-SFc*SU`_iSh5|Ovi~qcWgX5g_+gu9X7@o;cSh44$@qau<@ySI=f7;)%Yy#R47h`iAcZT- zvD*}dHO{*_w!)8EC3C-@(+cw~nsQn@VD)Niq^`ZbroO&*-z=5lf?2R+PRlx&GoOBb zNqFg!{WH?5sb5_s*1W(_giF?g@e}5F6YB3>wvFJxYl~-gICZ*3R_z6p2~xNclY}N zz60v&mo`Rp^iX#?{j$>L&|h@>7u@O4V)pHwxO@8a8=VYnt4YKC3?sVJ+5cvzd{15@ zDO|l8_h<*_rI(Dp$=>Vwgb7jhDLnO-(N`?Hd_V1maR2+9e&rnO)PLLkV{Tp@a9^{} zEo&qd&q*iiT~3@n`S!FN6#B-0^Vjl!zj$xdd{WrdbjW~#{aRx0@Z_cn^Ok(d!P<`8j|H@bxsPM?nVY&SY|;70h1 zKZPEVZQpVJ-yCkHn7r>FA(bm|kt+5Z^irK_zt6#c|GJeWNCqSWk^#wpWI!??8ITM} z1|$QL0m*=5Kr--oFi`DR6|A7=iIRcps|*!mWy?Igh{ykL(I!o||I=pR^Jt%}Q!*eK zkPJu$Bm3U~C2|7Xbf|6jwi zEJZRP8ITM}1|$QL0m*=5Kr$d1kPJu$Bmy`{i1|$QL0m*=5Kr$d1kPJu$Bmcste93@hKr$d1kPJu$ zBm~VJ39%2u$4I5d1v);Adv|hJfvYxk|u^zV`vhKESvG!V*TIX7)Stnb&tS)Pd zb&R#nT4v3+W?GF_l{L-^TSKe?mSG|DZ|1w^o9650OXl>}+9Y3EM2}Oks}@c80Lig`FnsRAHwG+azqG zunof23tK1bWMONCtr50b*eYQs2|H2PN?|7mTOsUtVatUbC+t{Z$1qFd|3T(Q2qOP) z+4tGk+b7x^?S*!^oo9V){n7e~^_X>?5lr5dUU?$38)T+ zFC0yTV@2+8#_pPAth);a0E%Tp0_}q_&m>{}KVG1ogY5V1zuSMbe_{W|e!+eYo(0@% zKWyJ-Uk7jgFNgR4=ZW|K>tF@IQu_#dp50(ivd7w^>_Y2f+p;z51M3y**VZ4b7p&*3 zZ&?pp_gdFmw^0@tSQ!!R<*UlDz@@0zg2DxHUDgWXyN_d z{@-O@ZC-5NWS(uFXr5y3FyrPb(=ivCv&>EA6tmc@F^8DtrePv;KGfw*7@S>m>+#OsU>c@KE51z+HhG1E&YB44fR;88|S>S<6h%dW3O?sahBm3yNxbmv$4roX&h7Dvf`bzysy;*P6C+TJS z2t8j9=t%pk_O|wh_KNmn?Yr9J+JoAi+Kt*3+IiZk+6h`l+orW?>$PRtTy45GS*y@W zv>}?U>FUSo2kP(DU#c&uKUBY?KBC^I-lkrwUaFp>o}!+hrq!+LG3pw1u{uYcs#dGx z)KThSHKZ!O4}I_Ye&>7D_oDAv-{ZaqeRuk9^j+yY-*>w2WZzC-!q?&3=v(1i;G5~I z_f`5v`-b@j_;lsJl>hv~$@KrF2J_z~or&jjFb*&Dt5{Jw(bae^b9L^*vpLv~=Wvk3 z^Ejx)Eevd4g_}8;jAwB$49{c*Ip|hAjk%n0cq#{D@ev%1#M3z#jAyXi9q4@A$Xp%U za1#fs@e~f4a03V9a6QZ24vnm1uC}#!G6w-%%Rt1zH5|;x{Kr=#c^H0^75a7zG^s+M zv++cMPQ{Z1^6&(9<}r(LB?GNpxSWG_JcfhWcpL{)@K_EkJf59@G&&QHX0D?+ za0v%fa4E}l6xxGFGS^Yla4`oVJc<4$iVuIcmM}ua30IF4wy0pg1=(R z64%AB%|Qf*7+5Z7bOm~kB`$Z+2OJDRf960%@3TzH&_(DS=32HHy~}}t-ezFw zR`e&9X$krY`Xh5K8H#?-K>_*$OIwV3(3{M)82&ae2ZPaD94P3w3@jRg-e6#1JNgYf z?MQSc`ZaSMxfT72fd%>Kmn>~QIvKsr&^&ZAdW|K{TZvxfAc+2hrOidRqgMpF1pPvw zGttWowV?CS&)5kq8_>@=s6a2Vv^nSk^dfW3Nud`wI12rQgL?E+24=5EKW4dSq4UrW znQPW@=y?vdqaSdv68(q+ANoGa-Hfh6-xKIG^c+iU&Y)*G7>K^hfq|Z3nP#HB=qZ6t zK~J;9nX}M$nCl31J$gc*tI@Yu;t?8pQn)Tb-{!7-^f&`E(&#Y;rnjO;Imn<#7?`#e zeUqIw4TkbzfjsmLfn4-;mTl@<^bm7RMR%eH1-c16z!TS_`UOper~~(B&MIqsthmnuIRp;6!u@2bJhzR&*6Q9bLp+la59ga!`sc zU}=-kwdj0-PDAIh#EGlWxeQc>&^a6|LT7U@3w?!y0q86SCX7L6vhypTb7wHu_)X|^ z<{A&K)3~b{oytIY7dnNdm7`lw4@2W%`e#|U;b>~`iDRoTYv^a!{9V_1ff=!{n87#TmB+m@raO>JTsUkeyhF_8!T=V06O*mNK|vKDXubm@Vj@%WZ87w)iSNNIrRT$hFgq@(E9-TRqqcm>Qs;>GmUhQLM zkfOmS{}dYkk5kuTas#=XoClHN2_iCFN0ySgEHW%7VNwW@p$3uRpY`AAuj)V1zo&mo z|GIv+hz!r{7a6Y77eZv%pjYz9(Eh9aw*3Y?S9rmG)_wwZ72IXtXkTexV4q>T@Ju0T zJFwnhIXq98Zr8$of+9QL_FMmirwMOaufghr=U^wn1J>=Z2H_IxEAT8~x0SRyto7Cs zYYsd|sItabBdmdzVg8r-zWJ8|hf-DJTmL z59S3);G@8Mfj0xM23`n!H}F{C{=lt)y@87ZX9e8AjzBEX7FZWp9GD$w3QP=?28O~D z0@eSa{~iAu{#X3Z`@iG=rvD!QE&i+F>A)HOll|TPZT^UVjen89+20_Z4Oo8F_`C70 z@mu2+<44BR#v{f(#?8i6#s$Xd#)(G8*lHYOtTqYqiDNY^_O~q>a{w zYL@0xKUCjQ-%wvsf22MQG5fvhSJi9Oi_|k!SKX<`)QGxPEm4Q4ma0OW{*LdrzF+u$ z?0d%dsP8`Ct-ig!i+yMLJc!cczINYw-%?+TZ>q1_H`Z6=%l8?|$I5%ko64)o3(9wu z$CUe&ufF|%DFXg-^wqB_SV2FWr=$X^0zW$X19ZER$icIeE}s5_w2~AkqQnKNRJL>U z{fx3rpd*wRN8hVbwsQ1bSc!7<>~YE#j=sBGX&0zY*(}f)rBk4Q;t1qdIyib}q0+{i z^)$LuiR9p|N^1_@pd7>DchD`$27cCe+Let0wJJvoG+jALplQk`e#%oQtE|mIPg%p$ zpE^NVCs0yZFVIkBHP85MbhEN52TxO$^Ym}8QdSByP+7szw+1WAc*ZBujmpv-yi8e` zgL{<4JnNGs$`XN0Wf4z)0^Ok;$(>J3QRWNOsLX@!53KAQg?Dja<8Jr@@hdxVhTT=} zKzHJlKs^}73Z7x?KquoQ%f4eCPIKVLFv^hDjrQVg%+;O2F%Akaz1zb|w~Z4FWCmdv zSIC`4=VFJs(hiPtFbC5+KCGk%;!X|%7)BRzr_g0M!d$71xSfOPnBM-ukK5MZHVy*# z7?yiGJY;AU=xhw*1|@W%t1!LU!%Ejl_$UUF$Ks6)BsO4r+lQ6-CJf^QxnoemT7mZB z)hsc#5Yt;fti&eabqs9F;8iTsR(JxjoVm81i0R!QR*!3Sjyu1;RhcYMr_vx$jZ)7uK7_uiRCDJ;T}rJ$ZAy(mVWo;^d=NS| zF$d38Ch+tJH!76^=?XkGqrG{cT&dt0??*Q%<=lDyHf5|p?aDZTW-4O@BFcDv zadhuIWwbz=QpyXw2kljgx$~Y@rGz`bhE7vPap%{3N|-zEM%O7LxbyCv%1D7Klp>yd z7jzpQmeJ1K*JTd*`T_7E4ocFbMQO`9-PtU+0yQ@b3iLjNu6!t?$Yr{CkeBI2Qj}pbhvp0xiXF2xQ~ma&&nM{*^$(@h=Tk z@x${C{5r4gGEiT5oJLE&>{tvB+Zd|HuL(2=zsfUS3QwAzsHj=K-c5vxbyt2_*sD(@zVkg!`~HXAby6Qavq%W6nCDN!QT;R z82+|EL-DsbI=34?$xk^4U5X#)&T|^@6Wn<=Oq9oR@DBWF4qkyD;aShF#SaTqgTKj> z;V~G72XmD5vpVrZ0*%KH3PkYNdB!uL^n1AT%nZI)pg6uypn43?>u51&7UBo^DQBP_ z{59@8qXpkBP&2-ZqthJ>598=5r#Ij`1**e$@RLu2ud-XY^R%`2Hi7E!R|Oh~Z{g_F z`S=EbD)5a0jl=Lzjuw6DAbgWRCcc>$eG0k*Uz>yH;%jm+i}&)Zr<{bZYaA0z1Ci0&$VaR z_4Y)2j6KpGY@4=fePq3F{oeYO^|JM2>sjkb>l@ZR)~yh=Uv8amodNp?j)ffrTdg*0 zgSFgRU^QD!2ig7qJBZ(ZX8zE8+I-A>(7e;U(Y(sM$oz`gW1e7kn=!M)+-R;ek2IUj zCbQZcXNJu}(>6)ypP|2m-VXgX^lIoQq3?&D3Oy3KFLZn8`p^}j3qogvywI_s?V%_{ z^y@-PLvusZLv;|-j}DCp4GIMzs{cpuz2IBH*MmO|en0r_;5UMI2X78u9lVgm^}B+} z;O5{_!BxS9!RBB?a3YKB2L}B?6!>f4?Z6v>UqEdCY~b<0gMm8(Hw3N-oEJDPa1uoK z@jyplV_?$U44uhK8n&(vLgr=HLqeUrXIU!c!~r#ut& z(fTkwPdDHh!e6vMX}{K9)_$Zt15Xhi(C*N#*Dlk})lSil*V5WnEuyW{mTE29G_6)E z*TPyMJV{X1f2i-NZ>g`VKU068KBaz>JxkcDUZQ?Q&8o+#DRql_w7Obdq|Q>C)GBqX zTBHtA11k3YO*~h4!S`L?W4;G`xBIU5UG6*2cdGA1U$-v?PZl=#migxSX87uS6}}SR z5TE7K;Mu|l2hz(?nNm`JGuvZumH@_J=lZ= zV4&{7E-U~6;=wj7h;Y!kx(6GvFiuU^J=lo_V59EARxAKD#Dl$95ZIv0bPsl8feX%q z?O0fW$cA{ZA&a83bq}^=Vcc~R@nBCD1UBd@-Gg0O7$=X_J=m6oabkn+!M-evvY}Y;5v;|<7?!m4tj5kl# zJ=nGd0GbK=wg3#%J=nN~u`^cpVCNQq!MX=qw*ZVJ9_-!13aky#J=nbkE@%>L-@>?K zweG?GEdbky2OGGs0!spP54LcDt4a6j85l=A*u;euSOB1Vu#F4jwzawk`?vrEbPqOi zVH| z95qe%!VGA-H;RD}@kRnrU~K^LiYS5w0J=AVCT?ogz2OWj*1cg2Ox3-i3=AON5C94+ z0MNZc>e>ip4rZWM_X-#&C*B~Q>15*NQv?eDbZ;O{+@R`S9tG>i=-vPZ;1aMYSQjIn z1wdJcPA8tp5wH?si4olkQm__AFF?T>xIX<1Ow{39m3jsdj{s0$Z2&y8X09Q`)2Is; z0O+1dU8~_L_Hh?nX$o^S>mFtRMh(%lRp=buJ&C$j`G|WWcU`BuCooq;caNuFrK7vY zF_6~XV;S)4?rsWJjMUv-3>>AqI~fQOcLx9k)&>xlYLo&C0Cbm%6kZM`F_l`b5|^pe za&(36QkBBXhv;;BD8|b+6S_YXE3gtkcbP~nGjx}U)Y7fQr6Q%k0s!5mDutI6=q?kf zB|~+WiPYl3#HAvoz)Aq!Wh%9Jj_xv*TCC_URVlm(s$(Lxu${P6q!d^Hpu0?^j@+ud z5t?a1K5?l?Df7|E#APZ43jlPNsuZ5LQg@k1%?lEjiPT(l32~`NDX}q2WNJ>m?oye;bB-b|RVf9Q1n4f4sW~a#WimB;z3x((!n2@e zrc$$xBQ8}b1(pQpE|n=fYrF1JmBO=NM5#zAumFI#RHXo&rn^k0nlrjfWePVB)ZO_E z7{sM2rOZU9=q{BhJaZOtsY-!sFL9|%DM!#AQk?<>gUW>J2#vVS+;zR~&IE*y$k$z_ zR5Q}L%am$*tL`$TnhrHnrNYzJ5|;{<0t*0$OO*o+zVZ^0srN9CJ-DPq$8K?=J_eCpu1GAa7~f! zGPSCPVP$Gny+(JLT2;eLW@=SkuDevNaMdK;WnxuzqV6)Ws;VR|6)Oc60O&4ND?I6F z-KAoMCzTSHYLx;D0EkP)3J}Z>rdAVI=`K^N%8>3-wZfH)beD=1uAHU2Osgsf=q}T$ z31f&$wMu~n0J_V>YWyYwcmCjl1pvBB)e4VqhFdQR%Dafm#0nMw5SNOT0t*0im#P&W zH%xb#Sd9x4mx`4F3jlN%(X_Es2-Pa^+(MXE!TW!mN!6I+b*5Bf(u4|?G6pUzCRAgV z=}f1}>Is!81>XPbOs2{P=~Sg~*?7VE9D{Xd}+1>g#uN)#SlLa0E2<1(EI z)aW9@^ar9?XXXs3wN*%()sT3wC)233N&ZMbCBUG6bc>k|&p=FkAAXJyYu~%oh zR1CMIG@*E=&QvL!B<(Z=sohi_;E}aSx9$KR_`5Ahw&eUg!p;Pg}h0}E^J-D!#P~lPF{Xe0? zqrm%roe9t23Z3c>9$c<7)hX!Ksp#N>TAfM`E-2AwGh0lk+$iw=U#D_|^EI7`P5xw^ zX-)oiok`8W89Gy%fzxy*Gy^y2RA=zOJe{fx9ypUQjmd+1U?wqnb9AaOIB%v-^#$i; z2vrv)4=x9)E_lFNooS0*qBCi+SLxN%Zy%{MVXr_>+HAknKf~^vrDhjrm zb*d-WoS`!{F;CE$n3xlErX}VWok>aPM4c%~D6N;#{Gn!@>Ie?j>!r-b2on)_|4*of zDDeJYXBradCQL#CaHB&N1X5g`DTx0Boe79Pqci>RZ`GN6_`^C=4`Zj!#KWl2nRXae zgi413@Beiw9hj`vnQ)Nfbfz0*yiR2UlQDW8wXl$yNrpxURSX5*{}ZYh0M65yVra(@ zDj0BCpQ|zFR)qwk5j2#0Sg+z`YPacKeYy-N&$~{dvuLDl%sU26A)X#Yg^>U zt2HRhj|XX>5Pm#`#{Wx{+t6XWr{83+fWQ1V!=4O(9blwA$PU1J`u~I#|F2s=wZ3OP zVLfQw0c-v*wa&J(5bt+c4n+G)trlx4to9#k6NBsBtzv{one-W(VKiR*-AA|SwYyFG;v;2+z zN`I+;D6HY9G5nv6-xxp0LU>PqlF@B!gZK1nj73H>tlyttlo&${ z%TUSR$-CqY7QH`3zCrFHH+Sk_eW~7}Pt~jSv3ij{5MuU^wfD8RwAbLh|8v?C5V7B` zU8h~DeMQ@&?bZ@nhqeLY^*P!Uc<*1P4buj|YW@Auv2yH>pa-^Etx(hH_kT_ z-v9eyjsE+}Tgq$7i^{X`{{McMoctf@0WniBdUrYL0Xd^+sL=y@29y0=xMS`CNdxCQ z-9`_H8aUrUw~-#uHR@bPdO+C#y*<+C0d0fiw_#ac56ByXcaR=XIGR4t=mCvmPM7q6 z%7ODwV@VI_9H2iQLwZ2z0R5qk^nlh;G@A5)*ikfs^nlz^6eT?%cofYfJs^32ejg+~ zAbNn_Y9KuzdlZ$C9uPi?rjZ_yK8k!s4~QQ$;VpC-=>h!%=bN)g4=5l-Rip(pkH?yJ)nzl@~d@h^vfki56C2B{3W`9^ng-Q=P;uOq!OI3(=tIV0ltQ=Cp{pTkp9|6(gTtS z=+!!-2SgK+U!|vmZi4ea=8+yyPKtJr9*|Co=8zuHPKt_252z=gUqna`$R|Y=qz43) zB0uQ?38iQYfyb~Ey#nQdi~@RDHF`iup}LphmZ=A%6r4ZbX!L-Xg7fF-JkkStN}UUg z9*|UUzJyLOdO%hgynyr|mj2RlBzqD=KbvD@Ph`nIg^)jc0(1Uk49OnPQO3v~$C6(J z0~@BJP-$el0MXSMXOV1@JJUusA)L39Y@9nIBpYMs`$v%MHjXkRyOp8uRgr9z zq36ORyM>`=q0^lVeHZ$-nIq_c!%=`_J2>)_Y&%EGNw$rlXBHaS2p|Q)nhYa*jDR;7 z*;WB>CE24{*6*~E>`@#|C)rILO(WTj9JL$S4S*B`Yd1)CJ##*lB-wQwonU0wvSe7N zVPw|`=#lJdo<7vbu3}DDlR>g8ne*GLNOlEB1C8u*k$f7-E@RGb4K}h%nG@Dzkn9rX ze6qyIE*8!`B)f<^O(VNdI4?7@M=}U&GDvm-OMhYn$ob1=HCU z0dF<3a~OOK^^ojrmi4hRBTGe6L9iOY$a0m07yl&7Rr1l1BuiBiqeo4W*JLHS+77B+E7O>orD} zYNUc-F#ySOk^K5rlI0@#P#4K^k$kAl$WoD15G)2DS+0@~!F1v(`JirOsY)scmH?0} zm&pe=8d)xr52ABPmdoS=@@ zmdoU=&>Sk0)Ontfr8=n~c=2y!sZc7g==>rA@2P0zH^arumGb6=BukYNqnn^iDwGO> zB>*H#l@gpMk}Ma>o63zW7s?xHIaDbBUwiKvW<{~J4R=@Vy}NhsG~^6J1_^>h6-fe; zqeKxHhCv1C&;2E>dRkD{0m1By9dz>FF5cdxaoXQQv@JkR%i z?{%K*ya&-_jFfRudY?$zHRG@speSIZ5%8*Y|gm-9@sEZp?R*;wU$EbCTjHH{!R+QQFqE6P%>@$!qb0RbNiwf@lHw>gEOe6MD6dL5$sGQjt429V zag$*Ehagyt5I!SSo>&|hL zCFKJts<57~6q|9YblDwpCUDn%8l9N;xrU1A} z@sgLJFDp4*_Sbil;w3Tg?ZaL zDIRhKUI6issikgGJS3(7xJmMm%1YtmniLnAf}c)`i>z$uB*jHm)^L*KB5kYEb&}#C zmnYmLc}Qhp3V@R&7in9|Cp$^;kjpciqA_hF0geu?;VRR2wz#GDtPW*q%>`W{1D(2>IPF$3ji}C&L ziFo{j_(Sn)Fyp=iZ2c|c@z__fw_^9lHe){h)L4&Lwdi3)0;}OCdV{sPQI{93F8pQ-yGs*I__Y9AuWE$V!=NKI9JRRRI*7pO zH;*VQa5-6Ctwo;I)a)6MGc&goH<453wOr^Cw*~+7sfGFZg|l)qb8-Pcroy!1zDwDgEEhpG#S z2XO5G8w^NAOl1Nm3lXt^zr?GRoi4JGIVIV-V1~(D;5D6@{=XA)a6Nqg^g0xPm!&;w zj@LTNvj$e(U3Ly=Scp4jCLTrsSLd9C{13h6Gd!Y>kq1W9D0pZK_%~4p4fTsxZ+iNv zjwvgg1=5)UdVOb>dCjM#&zCnAwHN;-2TuqGq2lD`d5z9Ym-QH`EcEL0zsiO`@ajxW z*G)WM!<$n$+pBj*`v0Pa6X6TUXmV$j6?lm$>1qq^mn^U4ABjoJdv)xMOhHS(#ZyAf!R1Y&0=_!Ts1P6lGzDc&#k2&V=*@_bbkx zlUoX6nnKjn#^clP&Z%X2MOnVv0Lcw1kyq#R^oc_XKv$EWo0p5a=QSMXS;w2p8o}=j zczxgm@a`5DdacHK7HDwzA@!3>%v`{=DaUZ@6w^g|wa29E`k1oZS#WW1d-J`_(PNbvC4!w7!{6#UYjY*Ka7QNC{WFS>1=9Pkr0w~@)}|#rT+@_n}v#i+8|#QxKgkAiRq^^z^{UEBdBiTPf*#tCOti? zn|a!&QY9%XrTx^(U}i2aqsLzhszF^>ZG6J3^9zgxPx`L%|9=j<}CcGvVf1|}=t zcX+kCr1Pu3GbK4*%M;R1Vg$ap#4MGUdlr4;$qnLRXd%eqsa@% zt6b;!v-1BRrc6nh*Qiz6DRX0pABk{rWfpt2TBff^-Z*%OLa$+q zbhR3ni@QXj<1;u5&!KRp*P?m)di#~3Ea_ULfq}O4(z~pU)inB760lq^nuKQopUlpMS4y<8-5WbRn^*!NFwB z@*9#&s)py)9_@+7jnW?-d{nBwRDRR1cEfbd^gpj4ob&26NPk`X&8&LW@Fnr;*H2$r zx~Qo}<#An5!I|S$aX-agb)9a8OYF=;+@33Se1Vkxc@sRT#V`82i?9>u=E`t_b^_+JGL&iG&V8TC)Pez zA8Y4di0+K82e;n*=-6nlXg!R$KNh(vavr$ydSO&ud0%*Mcn@I=y%=$SdoLdTAbekV zQ+PFa?#5znd&98j9&z7y?{zWqfzj{rV6AKDMx0N)>aYS-v({5}c0J=$XNI;Df+Rf%^knz!jGh=pASth+tOuZoN(ygZZt8 zZh`sU@2lt4c6GH{s`Aw&)l*fs57|%H+wC=Wu06&+5x0KyU+Z#&<9_JjSH=>*r72%4 zv=mAaNtYu;uL`Aw@)1EP@)4%{`BVo`_V7+#t8xV8elwUqE`G?w501X~)F^~wD@Tm( zN1^a7RivD`Mfh<9>i&$<%rDvwu5*R?jPW`GC6v$bvXic|HcL`G;tKZmpKyU z;7#FAW3Jb{9AUd3RE@6sy!tPVY5g@SNBr(rKyE&v&j4*Lx(8HRuX;J+dA|okDrml! zC`TOchwHetVy{6t0(d_jr<^peCOkvD9MQbrNq|trYg~@--4E~4;3>?U!!bO0)qJ$v zyo_>$@O~)372m5{j?mrj4f)f*@LH53eD~uic9256X<8-5&*4WA!uvlul0q}w$=vjv zP*8*Ci%{Kvz9X`75t&dZj^?2W`Y0|TXWF71vAh3I{l>NVf|v$sNhZDz<%r?^j;E@R zak{x9Eq6Wv4;Qh#|8U3p?>6<`q&ZCaLx;+RklwFcM|(K5wrZ6lwD&8Qg!>dapa2ob z`vrJ3Eov6-1;M<3FC#gYpqSY2BlE-E#^ng;{l|9nf0Zz>z-v^FK;ExSe|kpJFsW9K z7~bz%lLoX`yBxv0-#0P_FB$tc)Twwm0(QUF;AKGZAVl|zX9AJ7qVbL<4|f!BjE@wZ zjmL_Z-LIgd>AP0D9HF}ZU+6zGhilG4ye0_Q{nzBEGUuR_JBLvGUbS*W?EZzzoqNs7 z5uf|LGXoc9=M*6_&qarZ2~D$R!hyFaN0jcD?0BY_~4?fKQ))g$k!$f%RKTM8Fnv^57_uV9Na{ffOOJ!8Q93j2m zpE*Gq$8?R{|Ix5~Xu35%(sVbG+aapt5>yq$@_toG2T^4xzoX*#esGWUk%osvAn$uf zbPIrz7#&09h~xchCWd5qNCfS^hortDYPWDN5&~Y77b11PyarM~MKQNVr3GX<%P2I? zL3try_seT^9-6j@X1K}8k!~s88wBnCdxN@)i$TEdUko+lQ7aLv`?d0@N}rCCsLJ4m z5y1Nu#;@ThAH?f^`EWZHj}pYoC<%n@eo3HdL|zm3jriQZZ`09;o)PJPC5!d7*$ic-RH1{v2s`e(z5t94&HU#}^xLd^Eehz)HP+|zU{SrH>rwspw zKgzgp#NYmfPe3S$stm_~_}h035|vRW!BG{yaQ1AxjEKbjm(lc@QOKK7j!4}9*5D^| zOK}4T!u=aCUBmNH0*JZ&5}@9Xs(+A~byUk0uMS>6MC1PJ2k&YES&De1Jh|hfeI^w; z0(8I75mli}B;8K->Xai&Z)ticw&s$MbE2~1s%XquxC5ybn2IG`+B0?2e{CHIfwa*s=2u3x1~dy|4P#S!} z^FrwEKQ9EER8U^ia)j%CAAY*MQz9Ky+{uYYfau+S1Op7qIUWImcK;EKV?UdI5&R&G z2190hHOmpmH!(#gl_D>9Cfp4oc;DTK4}))z4i>LvIRf{7<{ZE8iDOX^gHxA3@q?qv zv@J*2?iW6F(&Qr4_IseJzIN1UH6K+0vAkau`cY#IFPjN9*>}Rd(C0hX%PdEH-^2WO z>B8a90Ub=C9XeWSlq1adOT~YZUc+)k^nO>^IKNlak2vs}A)xo4${0k5C>woTTqweK|3axt5AP;ocK_WRNKXl`F=BK7HI}{}`Y(8Ph|c|I zho7d-e{Kw-km-$qLm;wzyiy3!{Z~r7yId@uDnfPtsiIV>!T@PA`L&#yy=b8!Zf|X# zmH!~ndxa)+>vF{I{sZT7Dx8^}m6MGY5RV!9&H4homk8ng_Yw`xyxeT`uj75J3Q`f> zWR@d%_iKgpWpk~-m(=fcXi|=NzMHuizad=W*Mppe*=U3!tZ(Zd;eS7Qm=4WoFWrnj zs!1+hgxdMJ1=PmCrwCDf`cp(s&3yFu6M+hvgRvw$2!!cbeJ1`dLi$tx zT7>96s46WyzFBZ}b;=Rr`%lc2HMcu(TZr)e+oESFJ<8-F@iYzvv3Tj-AjsX7?#_6HW| zo53IO6jl~I5W6dOYw&RF#@I&mT&xMzk6jpB4jzF8fpy>moD<6eBjC8$@YujuZ_H-s z6#N8Q0?oh-SThy_H{c(^I?*H1ucMzv4+iH2mPFqKv%p@xH@YYKX!QQT6n$UxPOL+? zA$m>p%3$N@>gf4;7y3fZjh00V0s{lRqjRt>;f&~b@C^)!o*L~H92{5!)`5=E*1=WL z%xJw(F!&=@y0_JTL~BH2(NN@%$dSm`P#`!Mc{8#fDg;kPc17-s+!47svN^a2Yy@i~ zmqsp#BqQerIz<*hksvpc4OW7Qko4mdHYi|#93hwvr#QKICf)l)Jy>(D3xX@efEeUqf`=MJ<6sQ?$>g9r& z@C@&Ca1##l`glEqZ+Iu552vNq7#s!}Uf5INUxJs1zYBkX6%g-)4`6A_xbTbMGk6>; zA?^v^7H9z0!t20laCvxDcm-BOED9H6O+-$3T6iMX6tsuF!LaZE^aAw=cLv8ni*Tdh zbK%-pBjE;jhL!uP`-A(HdkAU=Z@By2ywR4MiunZE%@>5-TYhxHZ9f7y=i<5$9|4FCBE=boM)Y z0~b1b0x`YUc@!%v?sRSmz8@&W`ig4;S!fpZq-octbmA<)dp z3WfuBJ5!u-&Tz0M^mckWouQl1+-VrN5!?wGj_2sWFQH#U-v`eOd=dI8bSU&*==IP` zV9VScd^xZ@^swF^x)-dO+d|iet_l_hGq676k`NXShRz9<=!2m=^m9!MO$?0&yF!1g zyy_9^28D$-A#JNu^&)~AdLcnVpH0w6FCb_F!h?gBgMKVZHPqzEi;ARi#?$)`1tQQc>MJ@CE-^a8y<1@j8=!C9azUeyPgruNwx#RjG)sj}z!3%paXl zUsoq+tP=z=9Vh6eBLrQvN8oCgz|jstGaU$?S@oMIXe(G;mFlH_qeB{~UxUl4GTW%1 zgBz++QS~Do(n9?}&|Q5We7S00C-oI&#?%)CA@vzSAN2`AHT4leKpiCLt=}`CAef@uVO1pZULJ6=m z32-TZeUnnq?ht6sU@Z%15Hynwnl%Bw%${m1rNGoFP=~>OQlOmvOV3V}=%IE9G+?kF z72vA^2S25{tLp`7GT843+%0f6gT?<0uc6{t-|beYK8fs_TdNCx{Cfd>Wne}d_g4m@ELG)>FydA*XF1+nPyPK+uDbaKoZ~14y+e>>u>d9bL(5_5=5x^Hn zd7z#pXsn(Scu0V&3p9E-WwBQPS0bgbPM?0HQ4u8?s=EY+Fxb}+G*Al!_-xQ$a>{;> zpuW0-!G2cYDS^iY_`gDff>W5ljT7pre+q09C=nRXU_ZuS@rBh@dng6f83v2p735PW z1sXpBkoYp#?Cl`7LMgCV3gk0bpV95r@+bkqMu9B?a|K*FqUPDWWj6?#R@wtrJqC+! z72+b4s;=%A7|USuMS}28Qd}t@ZbB)L=?QeEU#`YKnW4C{gNBcGLGXvcx`-g5)-%{2 z30x&mCQu;2_W?#vN;;&B6{3r4XX<%55&(5HdhsB@z8CB`Ealf(k@W)F(sf zeM_JfJ5|ula?1KcfL|JI-9SGn&3y>>&@Qlo2C=+a!Hk;Z>z;8QcOG&My0)9)4m5GyOpg1mad*29WA?xf z_ht7p_XGDAJr863I9-CnoEdh$9@eG6-ic>q7Cuk=Da-+k7-LAVax zDNat}Ly&b$(MJ+*CteLNb9#mz362OnoY;prvt{7k#8ZiXy2G8kz;)045E)4bvY)vc=cW^IpB6@RTiR*?ICC&~#5pY6h1Yb?e$0~|!#KO65ouC_dHZV*b zN}QRP;Er?Z>#wQLB+);(hx$yyb)BDrYjg@)ifzKJ+?CRM0wR{5psDCk?}^(uc%6O> z?24bqKa9T}=%BBTABevIU4-57N8&rtUu@BJS@^b9i@D=(+%nf-cc6Vra z@NKX;+yFJhuFj=_My%er3d)V=#TGcX2eS10=yy5GIX_rO{}G!Jn*=?E!Lh!vo`}j{ zi**Vw480Y!0&(tzsUNHEd=mOD7K!QTFVSzqwwvo*2Ud?o(a*rv5Q%8-7w|QF7M|>8 zc?W~7F#{wQvrS&|o(cDI7Y5gPk9iM-w}Z!UYw%0&E_VP(ICg~CRn65)={fouVO{ikU5Dj@5nOfY#0OkuEI zqyIBy4kf_N$pEexq|Vly%Gc-Un<+g&@nwSboKo{Oe*k}w5M|U!Z7E^MjZcmT}>Jz{s-G*SUZWZ9K>}hH> zrB72U3Cc9P-BMkfA2j6LD7R48G&aGzlcH->iIu`8BWe&wWIsn>I1R%sE$k9PQ ze27X?vPAQ5W-0c=XRDuNr|w2O7prfn2uE|R0cSSlfj6FDsODQ8s%OvOM-&Q1=q#syjo=^Fw^y;}n-N*v|QaQmVqy^b@CZC0eYOarO#z9-URH&gF*z)h}QKC_?Z>K`w$3S`qw@AU4Tq=s-wXH{djc9o+U(AtvZX^a~Tz?+i9SK`5Q^ zag}O-%NGO{CVDvF{Wtk1(b1slcL^aBM*wPmljPtEoc)vwMt%a&@w>OkzXbm`pJlVV z0vWNS_-GL8QwmJ`1mMS)UsUh%{{=}tWrGagy_$?k>S2P3`a}Yd+Y^A#o&db{eC{O8 zZ#z-aXUP8t^*tQ`Mra1>MS;5sKr_#0fx@4X;GcJY;@!F~gZhPlDCRTh5kcRI$^}&M zluhjLy)2h{EGP*!c**^W09@__AZq7Rh{Szz`dBcz)82FJg92}bi>wU#Az;-H60iCS zN%C)iGo6km!t`s>M}ZZc_YzO~_M?s_Ui633hk^avvUErKAOGc_rjFI4{?w00CD65Z z=ugS2gxXhS{yRfSADsI8J~(xuoU4-m?l=C`J`hp<&7bPQnc(L8)1S)xQ?e?d_zB=X zt8)H3hW(-(Mdke8__H_tyMye?zujvW{C)OB$+k!R?e4#3+HL-tV@~H9h`vX2|9?H| z>%V45`t`rhw*L7q@=f+%?*FpC9KGD6(Utsne>s1bna&#|=KtCUoj&AmEOY;|hhHj) zIWj_g)!;J*FAZr~2+xkvKAy87V$0bpnhHcY7vi3bpx-yR-r$7>=L=eg__WFpCzsnB zISC;{`X5O^bOCPPL1C3s)q%6qk z3Opik9qlSPm$$8W%Rc}iSV|OgD;GM^bTCw21vb#G`F$t>Egk`GX+T_)b`^0R*!^i2 zw52Jpa26#%+fRvt*_41X110kLs}B7D%7Yd$<>fV}1QeqwF>eYbAigW`KIP4AK-)Q7 z_z;DlJ<#hVfMkO}uD}Tl)~^EJ(P=r{=m7ISq69tJmiJ6J1i3x~jhb9Jq7qDmIghYF20%RuYV+KGx;U*Mx0e*-dhB5$+ z{~v%hz_alupy+o$#{aj+w?ZFaL;MQFs~3PV@Vxj!XawZNXJgcV3L?~z;2r26?}btS zPVwX7E#i&ib)obZjfW70{tOnuFJp&d?;{F*CAKg2bnNli!(bD<1G;}(Fyg;Hb{Vw) zR>mq~=f)O*S8y)01EwM79E%bEL5Mm}igk^3gn~dba17Rl8lZ%4A$Xn19cpe;tk3v=8&d4p18!(c8Wn^{ad@vC%j+937p)D{SY=mPX zL!lekE7A>P_^l(Ek$N2E2Ea=AgZCBm1K;yrM|AtFx7&LdIs-erZQk`z8n_JngehnZ zEcE7kbHPzK)f*3%!qdFI&=WktYv;A_8hN$BRp@#)*b2W5e-2&2x5KYOS@5awKf@1% z?+V|FSpC}Y+VG`NA4rDJg~DJ#_^j{@C=j3zfJf-NhmQ}p2{#Sb57!7s!D0Bj`yx+znuHSmmy8m${4FVyx+y<(>&n!%^;Fuo|A^b^)(p zOSdr;2s7NUtDIk)@4)o%k@JpozWRiJU8Hk1-W`gi?<{!)LW-v)ohUi}2r z67NB8+?K!jtR2fbRszRL;BQKRzHP<$o-uIONwJ+JsTl}v$@|PPkL@6U*ux|>RA7j}V1l#k(*y%jUL7mdzbhS#~GNoM9g? z&{3d+Kzjl1mzypFJkxD%V@?t^jw}OptNE@ph0h$J=o7 z1X@4|*aWBB7K04poNoOtsox03N%L=i*cr_@O6Gl5SDM##YA2#RPZ#l0OPWMFBy3}_CM z*5^>`ARRK)dY@p33_K2|Celju)npBGW%Q43+xqmj-a3QtiUq@PYXOHu!o?p^`rpDDt)cpltRZrVm(CA%X(1Y0fGAk?jtx^dfra9?v>O%0(TRfWZflj zr@$Qow-cNwgYYL>w@GR{K~L*ef*xR;XSiA5CV_1P-DTQGHz;u+)eS`D3^xdD7T844 z6=Y)!*AaA)zThs+pVoZxsF{y1JH z5*!cR0nWUXprdrhc7VtVQXQm!y8|>OICT+0d#Hl|+JVF$aGVU*90%TcPOTtl3q1~o zN`f{}5MW3OR1mZV**n8B3X)ncrERP8c)NtR99*_q%=S67ZMlfI3wg@}?k#yfN6RwG zX;I4C65jHph!*qNE~0JoLf-NuqUQN*=kazPZJY5haI;*t=kWF{+BTidTb{3!$J)O7XcsrK1 z^~dmbG;QmR;w?}4sLNyGb%s+;9iHD&hx-I-522jegL%u*b1e@4YYn8FT0BLh7Izrb z>`ys0`ti0eZ~M@;I!~{vehS;Yc*_G&)lVY38i&=@da~Vvx7!rK#g z%TpH;oyd+K&)bf??Z8`}CKhW)c8t3|Vr|)OLtD()rY(0ZL|c*_X~Em(ylqBXuPJXc zdE11yjcJQ{&9rUETMqcc^~rYY@s_6rVSE@lPHo=S;%!ad*5GY*+J<<55~J?0gWSJB z3hc0Bv<*ag%i|3JkL@sRwaZ(FwkpKiAa5bb9=0`YFjqGm_QJdD?s|r=|Mx-St;8#d z=Mnoq3I)JB6SpL8K;(ZVGyu;}R3sK7?$1xmh6>=M#27^VX5N3IHDdmHiRy_6lmLH2 z#Q#3byidFbI0jnB zo5btH6LAMK`hNu1;GeYsZ^JzPYhzc&E{UxG3&Ghmk{p{3HiA*m3h0CR`^Q5qph=Y) z;E&O-5XZk0eKou@yaRL5HzLMe9bSo<=nKO|;W>zKCqZLxaJVn{`8y%L%?#HKXN29b z1x|v)n0fxLd%)cXmi}FcZFjg^-Hq;AcQt05FN4-zkvj)m{gd3$h->@0Ju%a~jhhL+ z{tVZ3EzB`L>>P65MNGR7EQY(Boz4ztDnYLkB|pLVFO&?!?IT*3d?bUat>nz^I26JQ6${JcJ1L0Onxq3GNE+4DJYS4Q>Qu!s_74;IiOC%+r_? zoB79Cq-l{k1 zwR*K)sh45?MUkGPXJ8%0F7QX}K;O#7=vu6wSQ%XwU5K8QIjqt+IyyMo7yT-oqHVBR zqHZ)J>Y`WWNaS$j5Of+3ME0RiWmjY;lp41}*Sy3(YtV0>3e=kz=3GETpv{=xXR|KHT5oPJBKHh77_RR%9+d{bRy zQ2L|aRMMmTraGVV-%u+VUso#(N>B7_s*=;MspSTfj0b246@AMGRJlPJLw!{(<@77+ zJjVTMiNSLjUsj6^p2PT(TEzGwMp^0iUQ}lrT)_AOhFd9rpDHz2!uY%@X56c!UwyAC zGHL1S-m3~sI-l`5m1l4sNo z>A1(#XvTl4Q3gjE9AR*{!C{P#s-XsD$ly^m*rZQm+@%H?9LV^H8emYSZ#<&c)ybTGK%K;RzdF%iPsaOH4};web~D(Oai{8H@C1XM z4R&I@R~>J#qrnaaWvJvH)sEA5tK$r|HQ2^rYlE#A?@}^b=1$du(|4-ojCZJJ24!~5 z?JASgw<{T%*`Z|YWru3S`8!lY#@kc_gY^y8W8ALl8mz;3tEz3V7UM0drokGFH>>If zs~OBNm|(m~#SO*`Mh!+7w<(Wts|qvTs9b{%;}#V%7&I6#s2Oii%Ajq~614v?_&eif z`!~i-_OAwiG59m%_4ZE&k1$?m|7h?B#*Oy(2EQ}-t-)^$e$9BTec0ev2ESyy#{Pow zYWs7>4Q8xm(mr7DRfDfEUSaPy__D#57%#V9H28wSeTr@=cIFEG;(F0gl)^lgmi+uIG^ zYVa1umG;dBZ!);e;8w;J_KgO&7`(yYW`mm;Q}*=+uQRyO;I)jE_B95tHn@RtxqX$v z^#<1&T+5iWuQYgt!OIyd?8_L-?SB|tWAIXgs|{YlxXfN<@M449akSLtj-#bEcN{IX z&!-Nc^K9-oT4Hm@(Gr_Gj+V$;fOBO$eX%SQS}gN=7u(!%bdJn^JI7v1zp}_aPhg3_ zxdaPkw(mljGQ7}UM44yH8ke)}vn91apiH2YV1ZpCP%JQCph%#Qpv*21$QQ^Hm`6}* z&m}0aa|PxIoFy<@Acy$>9&yK5iSHAiV&s2+;+e!QjQQW3xDHYO#ffBM5k~s66O$98 zFvfpUqEn(J*7s*5g7IJCUn9zYEB+GJ^goR8{B4NvFULs!viO4dJj^zq5FZ}zhuFRY z*6Y{7T789;`d?z+`0E(2ee{pILABF8;fYLx7XD>4*CVPya-0qf5ce&`-lVgh95%@!}jpz@Otzw zREEz%??O)a4D>Aw44;g(?XAIcSS{?hzq#LH%={g!W`D+g6ss0)#c26D7os{?!CvIf zcBi8FkNq7hfnz0btOSmgz_AkeKf46n6^e9{?2ZrvUjZQ_W!oJaIxC=LL{=9k1t}x4 z<~k`z8Ie`XO+m{Dr(l`2lY*KNGCOp2Qjjx()&6WJ1wA8J?ed)z1dYf#)k#6oh^!h; z3X(>!j!QTxXd02#$Vrv4)wYR~B84|Br5@y@O2iuKq*&n1Zac|I&F8!}Q72U-))Y5I z0&faas<*i*Qg~B#Ysf#Q@_B#j`A&)@-t1PhofJ#F*{%A!DUx_ob}MUxn_`VOn46u{ z96qO2XE${g?{5jIwbX3RY+2-{NaIb}Evzft)GT8zb5gAGW;Y+@q-OGw&09LDEU`Q% zHAAeSZfZK8(#*QpO-(aq(n+1k`VthP>yWZp0mxxh({5o@ZO8VyU?O`vj@ zB9%8XH#jMhdBc&JPHF^OjbX9Ko81V7N+NFJk;ogF=R2vvvR^x? z)7Wa*!$}QdtHE41#VT)h14wSB21q9A0IR&&4Q4p0{+w5Tgq!LIOWF0Uq?_t%%{Wk(n+1jnRO?+sh*r!muf)|W1U9hSmw>HHr7eCk-SAtsx?~~c%H4q z!aK<_Z+2pUn`(hP1$u0h59_?ynBAIc#s|hwLz=P`9pI!g*@_(Rq?(8ocTff!WGsPYqFE7!&bP=N!1n$^`jOnWrwlCDa9gh zwp-|?YH+4YwUkBPY`4CXs>bKIs2>?-_oYsXMc!RFVxFPLFA3BE^Z1UZ}{gSDil{T@eCZcf{vRC@$Mj1ALzW{oM4WV3W(LrO+o1m zX9uxTE=5ifqqitN@sR<%v6keW;8co_1RGVQ_(-hGtRx?aab2iHi;Kikuu5@}da_d~ zE>gE~D#b-&WTjGEB>MI%#YL*9QzmJB(0x&JC*Dtt)C`3mE!)r`CHY8L!<|ZYk=9Sp&Sn>B9jWP7 zl8aQj!9*vy-&G$8K_x%KF}dR5p1@GNEuyZql~C$C2bEVJ&tl*-2X8K^~l)r1f26r*b&& z{myeM$w?~fJ8O+oNnX;nz74vS>?EykNhzG2r1foGx00Nsvc91s*-Khq4{$5lOIlyk zWssLtFt>Tp4R%6pvZ~_h+~{<~)k84?+dbMY+B8}x8jaeKA0uBx-pAPMbKv>EFLE2^ zvR?&Gx)qTnkrJ@cO@rd!kVx-H*T`{^CXrfLqitjE`eztzeFgK@|B12ITfI%*`lI6N zY2cR|ic!|?n5o_rymB#5hkt@P;D_Ni!Y_oM3_lpY9kbIngx7#UZb`TVqxOTtXR>xc z<8T*@*@xXf-0#CR5Kq4c27qVWSKR9nS>J+@`lNd?#_99jYvlR*N43(m)e-dtln@T6=hS0rQ{o48tJ;aR9`9j=$FrF4 zu^#I?wnP6hg?S$5CW^7LV_M>LuoU!3G)=Svvt#Xmf&)P7MV}Q8C>ti$n|qvz){D;Z zO{_YX{mrqU*jQkfGZqNujD@w%atc~6db)37jk@e_hGpu;nuo@)n61EFCr6@{rRVzQ zW}R#HgVatk|3|JJJMfGwSXl3aslGzk&dd32wp0Ti&*;rV3FQ=fDrN>KVCb;&D z1-d=4nqW!3vA|Ryr=XRkNBiamJ<99{DW6!4!OJIBBdpvv78dWzDQIQsp}u*(9%A-` z#80e-;PDfy0ao_QfoNsvfhH6De#V-iPZg^^mY2(cXl3bszImPQYxaW$P%_cV(!C|K z9@euP3$%d70yCh0Ab0{Kvo4kjOD0-bx~Fe$(>;9ieBIp~Iz)GqOti9eSIMjcW#m8DxqW*i)bV#UVjW@1GL=%!*tKxSwx@EOX92@VUfegIpg>_#g~?KhcY)XQRh5Bf^kjaHU=(Kk1#7tH=KYM-&ddm+|$Ah|Ra zsK$&1LMb^Jtt|D7WPS@mC&@%BOFd;W!R;lPXl1DzhD zUw{uztk1#8A=YQ0QfDl1jJW}@by**)Et2(7YqeRf;6v+LwMjBR z1ka4Iz+@=a2Ot+QRx7npPC00;S6BJwWomSBoa}zrTBR-*^BrrGx=i-J1L7dbd>f}2${JYn!ttus%uLsl$$$ZVaR4tdx*Fa@ttRV^l z=4jhl2dsana^D1FitIlCvJ|mi1u2p2egz~V=Sk*%kf#`{m0BXZUq%5emduwy#3I&9 z-P9u4{i1cDI$JVd1lNkOz|JSu3m{w(YhOJq_O>8-e(dj93H--PfGaC?VQYC4(1oqb zxniOVTgy9vE^NKj$rz*eqCa4r z{JogJofkbV+BKSpd>(l@aua4_m!dzQKl%b9;AwlxyU|+=PWiF_@rQWqA08`#V?_=SPA?`N}y&1R04fDw|=C@3DGVnTUJ0K(3evqT{f?61%v>7O{_7{ z>w-kBh|fXf6w;Kr(2Vz0;G0xH56~AC^A*l=XOgPCD1LgaE1(7F3!RC=p0DjLifJUj z)*jMfUabn~0{WV5qKQRvdS1hdHb)EBL1y(RNv&L*);fI}%X_g2Mc~F4 z%z_?0%c((%JeL&BvdfBcy^IRz{`oq1tnh~OAo}N@2i;bdL?sb-d8+wY3v=_mrWKI> z`+H$CQFw(SVv7oh0s69T&;n(-TL}KK0HiNg2VLC?hy(gXNII#RbG$YckOcIV|I&iA zSx~0SMHLhUITBi@(;*V*pWd&8j__(%Kn>7W6eLM!ItdjK#R(xmzc_vIM@aNGuYeq& zuTeR$xVW%bM*R>o6 z{qam+dojBZbp`T&eq9-r52axvjY!Xds#|g9EH7RG9Y9}<7WanIhTdOQX)i3wfz}=U zPl)oRUsF6-tkv}&EM6@fgDT~utCVOK7NQBEJgjVbB%vfFU_qj0(dVPnZhrr%<0ILP|{GY$R{QnGrB)&&Oh8C&T*gYyi|HJEE~4r5DwmciMKEp(2-S&Yqfw!xVO zvkcB)Y^J9hoM!M$gHsKj!Prz!F*w=aB!d$TPGHQ`;|-o}a2#V3k&LmM=rJZe+TbXI zBN-d(5sZ!WaD&4P4mCK$;9$mv`ZUG{dXT|^1_u~Cm9f6=Z?K=iz6Sd+*3-QWo?@_< z!IKT1#8_9KXt1Zj9tOJ`?8aC}cQx3Bv9>;ev6k-4SW|amtf7xL*paci?qIOJ!FG(* z^l=8;8f?Rup<5el#hB174Ypv6>*kCx-Hb7+n=(dproko#8yjrI=;?+A8yKu_u%5xX zjA32JU~Pl77+ulNv0Yumq^ldOW-x=%(FucbgE50q#*mH}^bCd#x{N{X7z`N<8VnfJ zi~+3-+6FB_^#`L?zZ?9`;I9UMG59m1Qa>3yV(>?UKQP+rdxPH@{Fc#D-x&Ow(E39i zHux3e@9Im&-_#cdKWF?^eP-}e#$VJY1`iqh*x*M7KVf zz~KD`?_>Nz?PUC1-OKoyy2s$%2JbR>r@=cIKUKFgexi05yv^WtgSQ&Ih4GNO+2BnE zw;9~Z__4at;1+{7Fn**qGk&Nx8NA-$b&MaVjRvn}JgBZQc(uU|6#qXTzCIoQzm|9b zx_6Hz?n~UB*ajAW^kZ4i`j{;O#Go%!_14rbfm`MnnciP62Cwhe*pv zBdmIeMMB>1SoiRy_mTIG_bM0#p7b68WB+ZK0kQF4^30v+b@tj~4MaV!nimGUz)#_C z!k>a);Pvo};itjWe}DLn@J;{Y&8uSYY79tJt=qlGS#RuT?uQ=Lt^9-qFgjFXrZZ*YnrmT6Oz zw$%bXJpRkprJTe>SwTa>dZYCYr?(iA)Gf9&(zn=h6I<+wvfr*DXo18ZKeq*BTm&34 z)0#Qni`6{_M+uTP1P;3a#9;(-hgj9fd$H`m;H3s<7;MXjZyv%)EORkH-dzWKx)mkCVIKnl4uI6O!+LVbP_Zyn%CHaOuCz(^}Rs|GT`T~ zX~xN`l_h9T6(qR_?7sR8feD<8C8P%BIbboNNp}^rZZil?1)RO1KPRyqPEfrsXiFq{ zl?8PT9ClR+XJfUApnX0gRt*`HfNz}|CTaUsgINZpMz15C1^nE)`JBDh-o=P@Q-XFQ zK}*W}N=qs}=ALstmgE|2ENJ=(uD}9ydR|z9W>B8v<%Zw&azm_lImv?H-(Nn455pQQ zgD)DC$BBhBlD5rpw!^1gCQltJD0w$lmKc;W{DWMBa^cF9sumqzQtXyEM+p)vCRqeXT($yGsmb?j^QV zC#<*P{a7+&@Nz-J&AQ5-X3`z`=T~KO66>1 Date: Mon, 1 Jun 2020 12:16:45 -0700 Subject: [PATCH 10/11] mongodb --- .../insert_rpg.py | 13 ------- .../mongo_queries.py | 39 +++++++++++++++++++ 2 files changed, 39 insertions(+), 13 deletions(-) delete mode 100644 module3-nosql-and-document-oriented-databases/insert_rpg.py create mode 100644 module3-nosql-and-document-oriented-databases/mongo_queries.py diff --git a/module3-nosql-and-document-oriented-databases/insert_rpg.py b/module3-nosql-and-document-oriented-databases/insert_rpg.py deleted file mode 100644 index 57dc21f0..00000000 --- a/module3-nosql-and-document-oriented-databases/insert_rpg.py +++ /dev/null @@ -1,13 +0,0 @@ -import os -import sqlite3 as sq - -# Defining file paths -BASE_DIR = os.path.dirname(os.path.abspath(__file__)) -DB_FILEPATH = os.path.join(BASE_DIR, 'rpg_db.sqlite3') - -connection = sq.connect(DB_FILEPATH) -print("CONNECTION : ", connection) - -cursor = connection.cursor() -print("CURSOR : ", cursor) - diff --git a/module3-nosql-and-document-oriented-databases/mongo_queries.py b/module3-nosql-and-document-oriented-databases/mongo_queries.py new file mode 100644 index 00000000..a96517dc --- /dev/null +++ b/module3-nosql-and-document-oriented-databases/mongo_queries.py @@ -0,0 +1,39 @@ +import pymongo +import os +from dotenv import load_dotenv + +load_dotenv() + +DB_USER = os.getenv("MONGO_USER", default="OOPS") +DB_PASSWORD = os.getenv("MONGO_PASSWORD", default="OOPS") +CLUSTER_NAME = os.getenv("MONGO_CLUSTER_NAME", default="OOPS") + + +connection_uri = f"mongodb+srv://{DB_USER}:{DB_PASSWORD}@{CLUSTER_NAME}.mongodb.net/test?retryWrites=true&w=majority" +print("----------------") +print("URI:", connection_uri) + +client = pymongo.MongoClient(connection_uri) +print("----------------") +print("CLIENT:", type(client), client) + +db = client.test_database # "test_database" or whatever you want to call it +print("----------------") +print("DB:", type(db), db) + +collection = db.pokemon_test # "pokemon_test" or whatever you want to call it +print("----------------") +print("COLLECTION:", type(collection), collection) + +print("----------------") +print("COLLECTIONS:") +print(db.list_collection_names()) + +collection.insert_one({ + "name": "Pikachu", + "level": 30, + "exp": 76000000000, + "hp": 400, +}) +print("DOCS:", collection.count_documents({})) +print(collection.count_documents({"name": "Pikachu"})) From cff7b93728c453bb375c906281d3b8b6992bbc00 Mon Sep 17 00:00:00 2001 From: RAV10K1 Date: Tue, 28 Jul 2020 20:37:42 -0700 Subject: [PATCH 11/11] refactored code --- module2-sql-for-analysis/Pipfile | 2 + module2-sql-for-analysis/Pipfile.lock | 128 +++++++++++++++++-- module2-sql-for-analysis/elephant_queries.py | 2 +- module2-sql-for-analysis/insert_titanic.py | 3 +- module2-sql-for-analysis/rpg_queries.py | 91 +++++-------- 5 files changed, 154 insertions(+), 72 deletions(-) diff --git a/module2-sql-for-analysis/Pipfile b/module2-sql-for-analysis/Pipfile index f15c1e36..13523987 100644 --- a/module2-sql-for-analysis/Pipfile +++ b/module2-sql-for-analysis/Pipfile @@ -9,6 +9,8 @@ pylint = "*" [packages] python-dotenv = "*" psycopg2-binary = "*" +pandas = "*" +sqlalchemy = "*" [requires] python_version = "3.7" diff --git a/module2-sql-for-analysis/Pipfile.lock b/module2-sql-for-analysis/Pipfile.lock index fa5d5cd9..10d38bec 100644 --- a/module2-sql-for-analysis/Pipfile.lock +++ b/module2-sql-for-analysis/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "8652f92934fef2f87ef05d7ee94fc1884ce7b21c2f873181567b844991c22317" + "sha256": "d8f3061993f5bc9e04f2243505d55bb4fc8b945e19bca643a5dc1ada5e3e1dd3" }, "pipfile-spec": 6, "requires": { @@ -16,6 +16,59 @@ ] }, "default": { + "numpy": { + "hashes": [ + "sha256:082f8d4dd69b6b688f64f509b91d482362124986d98dc7dc5f5e9f9b9c3bb983", + "sha256:1bc0145999e8cb8aed9d4e65dd8b139adf1919e521177f198529687dbf613065", + "sha256:309cbcfaa103fc9a33ec16d2d62569d541b79f828c382556ff072442226d1968", + "sha256:3673c8b2b29077f1b7b3a848794f8e11f401ba0b71c49fbd26fb40b71788b132", + "sha256:480fdd4dbda4dd6b638d3863da3be82873bba6d32d1fc12ea1b8486ac7b8d129", + "sha256:56ef7f56470c24bb67fb43dae442e946a6ce172f97c69f8d067ff8550cf782ff", + "sha256:5a936fd51049541d86ccdeef2833cc89a18e4d3808fe58a8abeb802665c5af93", + "sha256:5b6885c12784a27e957294b60f97e8b5b4174c7504665333c5e94fbf41ae5d6a", + "sha256:667c07063940e934287993366ad5f56766bc009017b4a0fe91dbd07960d0aba7", + "sha256:7ed448ff4eaffeb01094959b19cbaf998ecdee9ef9932381420d514e446601cd", + "sha256:8343bf67c72e09cfabfab55ad4a43ce3f6bf6e6ced7acf70f45ded9ebb425055", + "sha256:92feb989b47f83ebef246adabc7ff3b9a59ac30601c3f6819f8913458610bdcc", + "sha256:935c27ae2760c21cd7354402546f6be21d3d0c806fffe967f745d5f2de5005a7", + "sha256:aaf42a04b472d12515debc621c31cf16c215e332242e7a9f56403d814c744624", + "sha256:b12e639378c741add21fbffd16ba5ad25c0a1a17cf2b6fe4288feeb65144f35b", + "sha256:b1cca51512299841bf69add3b75361779962f9cee7d9ee3bb446d5982e925b69", + "sha256:b8456987b637232602ceb4d663cb34106f7eb780e247d51a260b84760fd8f491", + "sha256:b9792b0ac0130b277536ab8944e7b754c69560dac0415dd4b2dbd16b902c8954", + "sha256:c9591886fc9cbe5532d5df85cb8e0cc3b44ba8ce4367bd4cf1b93dc19713da72", + "sha256:cf1347450c0b7644ea142712619533553f02ef23f92f781312f6a3553d031fc7", + "sha256:de8b4a9b56255797cbddb93281ed92acbc510fb7b15df3f01bd28f46ebc4edae", + "sha256:e1b1dc0372f530f26a03578ac75d5e51b3868b9b76cd2facba4c9ee0eb252ab1", + "sha256:e45f8e981a0ab47103181773cc0a54e650b2aef8c7b6cd07405d0fa8d869444a", + "sha256:e4f6d3c53911a9d103d8ec9518190e52a8b945bab021745af4939cfc7c0d4a9e", + "sha256:ed8a311493cf5480a2ebc597d1e177231984c818a86875126cfd004241a73c3e", + "sha256:ef71a1d4fd4858596ae80ad1ec76404ad29701f8ca7cdcebc50300178db14dfc" + ], + "version": "==1.19.1" + }, + "pandas": { + "hashes": [ + "sha256:0210f8fe19c2667a3817adb6de2c4fd92b1b78e1975ca60c0efa908e0985cbdb", + "sha256:0227e3a6e3a22c0e283a5041f1e3064d78fbde811217668bb966ed05386d8a7e", + "sha256:0bc440493cf9dc5b36d5d46bbd5508f6547ba68b02a28234cd8e81fdce42744d", + "sha256:16504f915f1ae424052f1e9b7cd2d01786f098fbb00fa4e0f69d42b22952d798", + "sha256:182a5aeae319df391c3df4740bb17d5300dcd78034b17732c12e62e6dd79e4a4", + "sha256:35db623487f00d9392d8af44a24516d6cb9f274afaf73cfcfe180b9c54e007d2", + "sha256:40ec0a7f611a3d00d3c666c4cceb9aa3f5bf9fbd81392948a93663064f527203", + "sha256:47a03bfef80d6812c91ed6fae43f04f2fa80a4e1b82b35aa4d9002e39529e0b8", + "sha256:4b21d46728f8a6be537716035b445e7ef3a75dbd30bd31aa1b251323219d853e", + "sha256:4d1a806252001c5db7caecbe1a26e49a6c23421d85a700960f6ba093112f54a1", + "sha256:60e20a4ab4d4fec253557d0fc9a4e4095c37b664f78c72af24860c8adcd07088", + "sha256:9f61cca5262840ff46ef857d4f5f65679b82188709d0e5e086a9123791f721c8", + "sha256:a15835c8409d5edc50b4af93be3377b5dd3eb53517e7f785060df1f06f6da0e2", + "sha256:b39508562ad0bb3f384b0db24da7d68a2608b9ddc85b1d931ccaaa92d5e45273", + "sha256:ed60848caadeacecefd0b1de81b91beff23960032cded0ac1449242b506a3b3f", + "sha256:fc714895b6de6803ac9f661abb316853d0cd657f5d23985222255ad76ccedc25" + ], + "index": "pypi", + "version": "==1.1.0" + }, "psycopg2-binary": { "hashes": [ "sha256:008da3ab51adc70a5f1cfbbe5db3a22607ab030eb44bcecf517ad11a0c2b3cac", @@ -52,22 +105,77 @@ "index": "pypi", "version": "==2.8.5" }, + "python-dateutil": { + "hashes": [ + "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c", + "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a" + ], + "version": "==2.8.1" + }, "python-dotenv": { "hashes": [ - "sha256:25c0ff1a3e12f4bde8d592cc254ab075cfe734fc5dd989036716fd17ee7e5ec7", - "sha256:3b9909bc96b0edc6b01586e1eed05e71174ef4e04c71da5786370cebea53ad74" + "sha256:8c10c99a1b25d9a68058a1ad6f90381a62ba68230ca93966882a4dbc3bc9c33d", + "sha256:c10863aee750ad720f4f43436565e4c1698798d763b63234fb5021b6c616e423" + ], + "index": "pypi", + "version": "==0.14.0" + }, + "pytz": { + "hashes": [ + "sha256:a494d53b6d39c3c6e44c3bec237336e14305e4f29bbf800b599253057fbb79ed", + "sha256:c35965d010ce31b23eeb663ed3cc8c906275d6be1a34393a1d73a41febf4a048" + ], + "version": "==2020.1" + }, + "six": { + "hashes": [ + "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259", + "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced" + ], + "version": "==1.15.0" + }, + "sqlalchemy": { + "hashes": [ + "sha256:0942a3a0df3f6131580eddd26d99071b48cfe5aaf3eab2783076fbc5a1c1882e", + "sha256:0ec575db1b54909750332c2e335c2bb11257883914a03bc5a3306a4488ecc772", + "sha256:109581ccc8915001e8037b73c29590e78ce74be49ca0a3630a23831f9e3ed6c7", + "sha256:16593fd748944726540cd20f7e83afec816c2ac96b082e26ae226e8f7e9688cf", + "sha256:427273b08efc16a85aa2b39892817e78e3ed074fcb89b2a51c4979bae7e7ba98", + "sha256:50c4ee32f0e1581828843267d8de35c3298e86ceecd5e9017dc45788be70a864", + "sha256:512a85c3c8c3995cc91af3e90f38f460da5d3cade8dc3a229c8e0879037547c9", + "sha256:57aa843b783179ab72e863512e14bdcba186641daf69e4e3a5761d705dcc35b1", + "sha256:621f58cd921cd71ba6215c42954ffaa8a918eecd8c535d97befa1a8acad986dd", + "sha256:6ac2558631a81b85e7fb7a44e5035347938b0a73f5fdc27a8566777d0792a6a4", + "sha256:716754d0b5490bdcf68e1e4925edc02ac07209883314ad01a137642ddb2056f1", + "sha256:736d41cfebedecc6f159fc4ac0769dc89528a989471dc1d378ba07d29a60ba1c", + "sha256:8619b86cb68b185a778635be5b3e6018623c0761dde4df2f112896424aa27bd8", + "sha256:87fad64529cde4f1914a5b9c383628e1a8f9e3930304c09cf22c2ae118a1280e", + "sha256:89494df7f93b1836cae210c42864b292f9b31eeabca4810193761990dc689cce", + "sha256:8cac7bb373a5f1423e28de3fd5fc8063b9c8ffe8957dc1b1a59cb90453db6da1", + "sha256:8fd452dc3d49b3cc54483e033de6c006c304432e6f84b74d7b2c68afa2569ae5", + "sha256:adad60eea2c4c2a1875eb6305a0b6e61a83163f8e233586a4d6a55221ef984fe", + "sha256:c26f95e7609b821b5f08a72dab929baa0d685406b953efd7c89423a511d5c413", + "sha256:cbe1324ef52ff26ccde2cb84b8593c8bf930069dfc06c1e616f1bfd4e47f48a3", + "sha256:d05c4adae06bd0c7f696ae3ec8d993ed8ffcc4e11a76b1b35a5af8a099bd2284", + "sha256:d98bc827a1293ae767c8f2f18be3bb5151fd37ddcd7da2a5f9581baeeb7a3fa1", + "sha256:da2fb75f64792c1fc64c82313a00c728a7c301efe6a60b7a9fe35b16b4368ce7", + "sha256:e4624d7edb2576cd72bb83636cd71c8ce544d8e272f308bd80885056972ca299", + "sha256:e89e0d9e106f8a9180a4ca92a6adde60c58b1b0299e1b43bd5e0312f535fbf33", + "sha256:f11c2437fb5f812d020932119ba02d9e2bc29a6eca01a055233a8b449e3e1e7d", + "sha256:f57be5673e12763dd400fea568608700a63ce1c6bd5bdbc3cc3a2c5fdb045274", + "sha256:fc728ece3d5c772c196fd338a99798e7efac7a04f9cb6416299a3638ee9a94cd" ], "index": "pypi", - "version": "==0.13.0" + "version": "==1.3.18" } }, "develop": { "astroid": { "hashes": [ - "sha256:4c17cea3e592c21b6e222f673868961bad77e1f985cb1694ed077475a89229c1", - "sha256:d8506842a3faf734b81599c8b98dcc423de863adcc1999248480b18bd31a0f38" + "sha256:2f4078c2a41bf377eea06d71c9d2ba4eb8f6b1af2135bec27bbbb7d8f12bb703", + "sha256:bc58d83eb610252fd8de6363e39d4f1d0619c894b0ed24603b881c02e64c7386" ], - "version": "==2.4.1" + "version": "==2.4.2" }, "colorama": { "hashes": [ @@ -119,11 +227,11 @@ }, "pylint": { "hashes": [ - "sha256:b95e31850f3af163c2283ed40432f053acbc8fc6eba6a069cb518d9dbf71848c", - "sha256:dd506acce0427e9e08fb87274bcaa953d38b50a58207170dbf5b36cf3e16957b" + "sha256:7dd78437f2d8d019717dbf287772d0b2dbdfd13fc016aa7faa08d67bccc46adc", + "sha256:d0ece7d223fe422088b0e8f13fa0a1e8eb745ebffcb8ed53d3e95394b6101a1c" ], "index": "pypi", - "version": "==2.5.2" + "version": "==2.5.3" }, "six": { "hashes": [ diff --git a/module2-sql-for-analysis/elephant_queries.py b/module2-sql-for-analysis/elephant_queries.py index 1ce5f307..6dc45fe2 100644 --- a/module2-sql-for-analysis/elephant_queries.py +++ b/module2-sql-for-analysis/elephant_queries.py @@ -1,8 +1,8 @@ +import os import psycopg2 from psycopg2.extras import execute_values import json import pandas as pd -import os from psycopg2.extras import DictCursor from dotenv import load_dotenv diff --git a/module2-sql-for-analysis/insert_titanic.py b/module2-sql-for-analysis/insert_titanic.py index 744cf6a0..0e180692 100644 --- a/module2-sql-for-analysis/insert_titanic.py +++ b/module2-sql-for-analysis/insert_titanic.py @@ -1,6 +1,5 @@ import psycopg2 from sqlalchemy import create_engine -import json import pandas as pd import os @@ -14,7 +13,7 @@ print(df.shape) print(df.head()) -# Establishing connection and cursor to PostgreSQL +# Establishing variables to PostgreSQL DB_NAME = os.getenv('DB_NAME2', default='Check env variables') DB_USER = os.getenv('DB_USER2', default='Check env variables') diff --git a/module2-sql-for-analysis/rpg_queries.py b/module2-sql-for-analysis/rpg_queries.py index 5eb34543..1354ae5c 100644 --- a/module2-sql-for-analysis/rpg_queries.py +++ b/module2-sql-for-analysis/rpg_queries.py @@ -1,11 +1,14 @@ +import os import psycopg2 +import sqlite3 from psycopg2.extras import execute_values import json import pandas as pd -import os from psycopg2.extras import DictCursor from dotenv import load_dotenv +## Setting up PostgreSQL Connection + load_dotenv() DB_NAME = os.getenv('DB_NAME1', default='Check env variables') @@ -20,71 +23,41 @@ cursor = connection.cursor(cursor_factory=psycopg2.extras.DictCursor) print("CURSOR:", cursor) -# cursor.execute("SELECT * FROM rpg_data") -# result = cursor.fetchall() -# print("RESULT:", type(result)) -# print(result) - -table_name = "rpg_data" - -print("-------------------") -query = f""" -CREATE TABLE IF NOT EXISTS {table_name} ( - id SERIAL PRIMARY KEY, - name varchar(40) NOT NULL, - data JSONB -); +create_table = """CREATE TABLE IF NOT EXISTS rpg_data (character_id SERIAL PRIMARY KEY, +name varchar(30) NOT NULL, +level int, +exp int, +hp int, +strength int, +intelligence int, +dexterity int, +wisdom int); """ -print("SQL:", query) -cursor.execute(query) -# -# INSERT SOME DATA -# +table_query = "SELECT * FROM rpg_data" -# my_dict = { "a": 1, "b": ["dog", "cat", 42], "c": 'true' } - -#insertion_query = f"INSERT INTO {table_name} (name, data) VALUES (%s, %s)" -#cursor.execute(insertion_query, -# ('A rowwwww', 'null') -#) -#cursor.execute(insertion_query, -# ('Another row, with JSONNNNN', json.dumps(my_dict)) -#) - -# h/t: https://stackoverflow.com/questions/8134602/psycopg2-insert-multiple-rows-with-one-query -insertion_query = f"INSERT INTO {table_name} (name, data) VALUES %s" -#execute_values(cursor, insertion_query, [ -# ('A rowwwww', 'null'), -# ('Another row, with JSONNNNN', json.dumps(my_dict)), -# ('Third row', "3") -#]) +cursor.execute(create_table) +cursor.execute(table_query) +connection.commit() +result = cursor.fetchall() +print("RESULT:", type(result)) +# print(result) -df = pd.DataFrame([ - ['A rowwwww', 'null'], - ['Another row, with JSONNNNN', json.dumps(my_dict)], - ['Third row', "null"], - ["Pandas Row", "null"] -]) +# Connecting to SQLite3 DB for RPG Data -records = df.to_dict("records") #> [{0: 'A rowwwww', 1: 'null'}, {0: 'Another row, with JSONNNNN', 1: '{"a": 1, "b": ["dog", "cat", 42], "c": "true"}'}, {0: 'Third row', 1: '3'}, {0: 'Pandas Row', 1: 'YOOO!'}] -list_of_tuples = [(r[0], r[1]) for r in records] +sl_conn = sqlite3.connect('rpg_db.sqlite3') +sl_cursor = sl_conn.cursor() +characters = sl_conn.execute('SELECT * FROM charactercreator_character').fetchall() +print(characters) -execute_values(cursor, insertion_query, list_of_tuples) +## Inserting SQLite data into PostgreSQL DB -# -# QUERY THE TABLE -# +for character in characters: + insert_query_pg = f"""INSERT INTO rpg_data (character_id, name, level, exp, hp, strength, intelligence, dexterity, wisdom) VALUES + {character}""" -print("-------------------") -query = f"SELECT * FROM {table_name};" -print("SQL:", query) -cursor.execute(query) -for row in cursor.fetchall(): - print(row) + print(insert_query_pg) -# ACTUALLY SAVE THE TRANSACTIONS -connection.commit() + cursor.execute(insert_query_pg) -cursor.close() -connection.close() \ No newline at end of file +connection.commit() \ No newline at end of file