From 0dda1d1bc33a17a097079359dbc96e4bc285025a Mon Sep 17 00:00:00 2001 From: kongphop Date: Sat, 8 Oct 2022 20:42:55 +0700 Subject: [PATCH 01/16] add git ignore --- .idea/.gitignore | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 .idea/.gitignore diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml From b9222ca61e5a6df02d6f38f5cf945df1fffd936f Mon Sep 17 00:00:00 2001 From: kongphop Date: Sat, 8 Oct 2022 20:44:03 +0700 Subject: [PATCH 02/16] init project --- .gitignore | 1 + main.py | 4 ++++ data-devclub-1.xml => resources/data-devclub-1.xml | 0 src/__init__.py | 0 src/csv_file_handle.py | 0 src/data_handle.py | 0 src/insert_sqlite.py | 0 src/xml_file_handle.py | 13 +++++++++++++ 8 files changed, 18 insertions(+) create mode 100644 .gitignore create mode 100644 main.py rename data-devclub-1.xml => resources/data-devclub-1.xml (100%) create mode 100644 src/__init__.py create mode 100644 src/csv_file_handle.py create mode 100644 src/data_handle.py create mode 100644 src/insert_sqlite.py create mode 100644 src/xml_file_handle.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..723ef36 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.idea \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..0403b30 --- /dev/null +++ b/main.py @@ -0,0 +1,4 @@ +from src.xml_file_handle import read_file + +if __name__ == "__main__": + read_file('resources/data-devclub-1.xml') diff --git a/data-devclub-1.xml b/resources/data-devclub-1.xml similarity index 100% rename from data-devclub-1.xml rename to resources/data-devclub-1.xml diff --git a/src/__init__.py b/src/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/csv_file_handle.py b/src/csv_file_handle.py new file mode 100644 index 0000000..e69de29 diff --git a/src/data_handle.py b/src/data_handle.py new file mode 100644 index 0000000..e69de29 diff --git a/src/insert_sqlite.py b/src/insert_sqlite.py new file mode 100644 index 0000000..e69de29 diff --git a/src/xml_file_handle.py b/src/xml_file_handle.py new file mode 100644 index 0000000..f070aec --- /dev/null +++ b/src/xml_file_handle.py @@ -0,0 +1,13 @@ +import xml.etree.ElementTree as ET +from typing import List + + +def read_file(path: str) -> List[dict]: + tree = ET.parse('resources/data-devclub-1.xml') + root = tree.getroot() + for child in root.iter(): + print(child.tag, child.attrib) + + return [{ + "x": "y" + }] From 7db593c021babd2bd41744adff56296cc4e5d6df Mon Sep 17 00:00:00 2001 From: kongphop Date: Sat, 8 Oct 2022 20:53:36 +0700 Subject: [PATCH 03/16] init insert db --- src/insert_sqlite.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/insert_sqlite.py b/src/insert_sqlite.py index e69de29..2dd67bd 100644 --- a/src/insert_sqlite.py +++ b/src/insert_sqlite.py @@ -0,0 +1,20 @@ +import sqlite3 + + +def insert_data(emp_id: int, passport: str): + try: + sqlite_connection = sqlite3.connect('sql_lite.db') + cursor = sqlite_connection.cursor() + print("connect success") + data_tuple = (emp_id, passport) + sqlite_insert_query = "INSERT INTO xxx (EMPID, PASSPORT) VALUES (?, ?);" + count = cursor.execute(sqlite_insert_query, data_tuple) + sqlite_connection.commit() + print("insert success", count) + cursor.close() + except sqlite3.Error as error: + print("insert failed", error) + finally: + if sqlite_connection: + sqlite_connection.close() + print("database.close") From ccdf72fbabef6990954643e995a616d0b0e9e51d Mon Sep 17 00:00:00 2001 From: kongphop Date: Sat, 8 Oct 2022 20:56:56 +0700 Subject: [PATCH 04/16] init database --- main.py | 5 +++-- sql_lite.db | 0 2 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 sql_lite.db diff --git a/main.py b/main.py index 0403b30..35c381d 100644 --- a/main.py +++ b/main.py @@ -1,4 +1,5 @@ -from src.xml_file_handle import read_file +from src.insert_sqlite import insert_data if __name__ == "__main__": - read_file('resources/data-devclub-1.xml') + # read_file('resources/data-devclub-1.xml') + insert_data(100, "WIN16ELU8GN") diff --git a/sql_lite.db b/sql_lite.db new file mode 100644 index 0000000..e69de29 From 1776f209221fc5c7c59f7bfb188f38af74b5a37c Mon Sep 17 00:00:00 2001 From: kongphop Date: Sat, 8 Oct 2022 21:42:39 +0700 Subject: [PATCH 05/16] add function read xml to dict --- main.py | 8 ++++++-- src/xml_file_handle.py | 15 ++++++++------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/main.py b/main.py index 35c381d..92020a0 100644 --- a/main.py +++ b/main.py @@ -1,5 +1,9 @@ +import json + from src.insert_sqlite import insert_data +from src.xml_file_handle import read_file if __name__ == "__main__": - # read_file('resources/data-devclub-1.xml') - insert_data(100, "WIN16ELU8GN") + data = read_file('resources/data-devclub-1.xml') + print(json.dumps(data)) + # insert_data(100, "WIN16ELU8GN") diff --git a/src/xml_file_handle.py b/src/xml_file_handle.py index f070aec..3351281 100644 --- a/src/xml_file_handle.py +++ b/src/xml_file_handle.py @@ -3,11 +3,12 @@ def read_file(path: str) -> List[dict]: - tree = ET.parse('resources/data-devclub-1.xml') + tree = ET.parse(path) root = tree.getroot() - for child in root.iter(): - print(child.tag, child.attrib) - - return [{ - "x": "y" - }] + data = [] + for child in root.iter('record'): + d = {} + for x in child.iter(): + d[x.tag] = x.text + data.append(d) + return data From 49ec9889c3f3f3611a9e80bd37f661cfda9f641b Mon Sep 17 00:00:00 2001 From: kongphop Date: Sat, 8 Oct 2022 22:18:08 +0700 Subject: [PATCH 06/16] add function insert --- main.py | 8 +++----- sql_lite.db | Bin 0 -> 8192 bytes src/insert_sqlite.py | 33 ++++++++++++++++++++++++++++----- src/xml_file_handle.py | 2 ++ 4 files changed, 33 insertions(+), 10 deletions(-) diff --git a/main.py b/main.py index 92020a0..e2133c4 100644 --- a/main.py +++ b/main.py @@ -1,9 +1,7 @@ -import json - -from src.insert_sqlite import insert_data +from src.insert_sqlite import insert_data, create_table from src.xml_file_handle import read_file if __name__ == "__main__": data = read_file('resources/data-devclub-1.xml') - print(json.dumps(data)) - # insert_data(100, "WIN16ELU8GN") + create_table("master") + insert_data("master", data) diff --git a/sql_lite.db b/sql_lite.db index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..dc1c4820e183c909afa677925a4b6a60d93eb496 100644 GIT binary patch literal 8192 zcmeI#K~KUk6bJB*XbdK(7h?#Q5-u9W%qc-{7FM8fY-246#?uUiErE@U5#!bPA^eDb z3^z6oCK6A2dM{nO*Dn7pzuWl0@MDQ5VKjGRe2tEfqM&<>5kiIhN|tpg$-I-_r%T%Z zRt0qVq?MAVl!H%{3@8u)0T2KI5C8!X009sH0T2KI5cpGpw_|1Rq+C|scVqW?Cg<)l zmdP(~Iv3gwC4yo>S_Z}0-ah`ZPHEp}I%cN0z&7FBwj6;49VKmtIb4{epX982gM4eZ z1a_&ZQzr{-F-P=t@|XvhL@>)F1{0f|9&@OkooIkdYu zI9valAAX=@K!E@VfB*=900@8p2!H?xfB*=900{iEz(gq(Yqd(TTC1K{l(IEo&Bln) zo8hSKMgB4l7oLnBWDv;ltJ List[dict]: for child in root.iter('record'): d = {} for x in child.iter(): + if x.tag == "record": + continue d[x.tag] = x.text data.append(d) return data From 1ddf562cfea2bb144f10b6e7e5c458794d2d135f Mon Sep 17 00:00:00 2001 From: kongphop Date: Sat, 8 Oct 2022 22:21:30 +0700 Subject: [PATCH 07/16] add data --- sql_lite.db | Bin 8192 -> 20480 bytes src/insert_sqlite.py | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/sql_lite.db b/sql_lite.db index dc1c4820e183c909afa677925a4b6a60d93eb496..61d795b61eb08fffc3e24700e58b67a2d0821b0c 100644 GIT binary patch literal 20480 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 delta 45 zcmZozz}Vn0L7J6`fq{W(qJljm)5e4a{9L?1E+hX82L2fv3(NU7Hi$D$o}r%s0Pchf AVE_OC diff --git a/src/insert_sqlite.py b/src/insert_sqlite.py index ae18f57..8acabe5 100644 --- a/src/insert_sqlite.py +++ b/src/insert_sqlite.py @@ -34,7 +34,7 @@ def insert_data(table_name: str, data: List[dict]): count = cursor.execute(sqlite_insert_query, tuple(val.values())) sqlite_connection.commit() print("insert success", count) - cursor.close() + cursor.close() except sqlite3.Error as error: print("insert failed", error) finally: From 43c1f005d409ef7623c38e85c4a3205263b8f1e1 Mon Sep 17 00:00:00 2001 From: kongphop Date: Sat, 8 Oct 2022 23:12:37 +0700 Subject: [PATCH 08/16] update db --- main.py | 5 +++++ sql_lite.db | Bin 20480 -> 20480 bytes src/query_more_than_3years.sql | 8 ++++++++ 3 files changed, 13 insertions(+) create mode 100644 src/query_more_than_3years.sql diff --git a/main.py b/main.py index e2133c4..d8c026d 100644 --- a/main.py +++ b/main.py @@ -1,7 +1,12 @@ +from datetime import datetime + from src.insert_sqlite import insert_data, create_table from src.xml_file_handle import read_file if __name__ == "__main__": data = read_file('resources/data-devclub-1.xml') + for idx, elm in enumerate(data): + data[idx]["BIRTHDAY"] = datetime.strptime(elm["BIRTHDAY"], "%d-%m-%Y").strftime("%Y-%m-%d") + data[idx]["HIRED"] = datetime.strptime(elm["HIRED"], "%d-%m-%Y").strftime("%Y-%m-%d") create_table("master") insert_data("master", data) diff --git a/sql_lite.db b/sql_lite.db index 61d795b61eb08fffc3e24700e58b67a2d0821b0c..042f38c5daa2c5112b377c752269f43c949158fc 100644 GIT binary patch literal 20480 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 diff --git a/src/query_more_than_3years.sql b/src/query_more_than_3years.sql new file mode 100644 index 0000000..1bb7c9b --- /dev/null +++ b/src/query_more_than_3years.sql @@ -0,0 +1,8 @@ +WITH DevClub AS (SELECT *, STRFTIME('%Y-%m-%d', HIRED) AS new_date + FROM master + WHERE new_date <= DATE('now', '-3 year') + AND POSITION IN ('Airhostess', 'Pilot', 'Steward') + AND STATUS = 1 + ORDER BY new_date DESC) +SELECT * +FROM DevClub \ No newline at end of file From 0332009b5c1279e1a29828af1ef8f8b5eb9b4e6f Mon Sep 17 00:00:00 2001 From: kongphop Date: Sun, 9 Oct 2022 00:29:27 +0700 Subject: [PATCH 09/16] init script --- main.py | 21 ++++++++++++++------- src/query_by_department.sql | 8 ++++++++ src/query_by_nationality.sql | 8 ++++++++ src/query_by_region.sql | 0 src/query_filter_wrong_data.sql | 15 +++++++++++++++ src/query_more_than_3years.sql | 23 +++++++++++++++-------- 6 files changed, 60 insertions(+), 15 deletions(-) create mode 100644 src/query_by_department.sql create mode 100644 src/query_by_nationality.sql create mode 100644 src/query_by_region.sql create mode 100644 src/query_filter_wrong_data.sql diff --git a/main.py b/main.py index d8c026d..4450070 100644 --- a/main.py +++ b/main.py @@ -1,12 +1,19 @@ -from datetime import datetime +from datetime import datetime, timedelta from src.insert_sqlite import insert_data, create_table from src.xml_file_handle import read_file if __name__ == "__main__": - data = read_file('resources/data-devclub-1.xml') - for idx, elm in enumerate(data): - data[idx]["BIRTHDAY"] = datetime.strptime(elm["BIRTHDAY"], "%d-%m-%Y").strftime("%Y-%m-%d") - data[idx]["HIRED"] = datetime.strptime(elm["HIRED"], "%d-%m-%Y").strftime("%Y-%m-%d") - create_table("master") - insert_data("master", data) + a = datetime.strptime("2005-02-20", "%Y-%m-%d") + b = datetime.now() + timedelta(year=3) + print(a - b) + +# if __name__ == "__main__": +# data = read_file('resources/data-devclub-1.xml') +# anomaly_idx = [] +# for idx, elm in enumerate(data): +# data[idx]["BIRTHDAY"] = datetime.strptime(elm["BIRTHDAY"], "%d-%m-%Y").strftime("%Y-%m-%d") +# data[idx]["HIRED"] = datetime.strptime(elm["HIRED"], "%d-%m-%Y").strftime("%Y-%m-%d") +# create_table("master") +# insert_data("master", data) diff --git a/src/query_by_department.sql b/src/query_by_department.sql new file mode 100644 index 0000000..6471504 --- /dev/null +++ b/src/query_by_department.sql @@ -0,0 +1,8 @@ +WITH DevClub AS (SELECT *, STRFTIME('%Y-%m-%d', HIRED) AS new_date + FROM master + WHERE new_date <= DATE('now', '-3 year') + AND POSITION IN ('Airhostess', 'Pilot', 'Steward') + AND STATUS = 1 + ORDER BY new_date DESC) +SELECT * +FROM DevClub WHERE DEPT = 'Flight Attendance' \ No newline at end of file diff --git a/src/query_by_nationality.sql b/src/query_by_nationality.sql new file mode 100644 index 0000000..4031147 --- /dev/null +++ b/src/query_by_nationality.sql @@ -0,0 +1,8 @@ +WITH DevClub AS (SELECT *, STRFTIME('%Y-%m-%d', HIRED) AS new_date + FROM master + WHERE new_date <= DATE('now', '-3 year') + AND POSITION IN ('Airhostess', 'Pilot', 'Steward') + AND STATUS = 1 + ORDER BY new_date DESC) +SELECT * +FROM DevClub WHERE NATIONALITY = 'Italy' \ No newline at end of file diff --git a/src/query_by_region.sql b/src/query_by_region.sql new file mode 100644 index 0000000..e69de29 diff --git a/src/query_filter_wrong_data.sql b/src/query_filter_wrong_data.sql new file mode 100644 index 0000000..8418a35 --- /dev/null +++ b/src/query_filter_wrong_data.sql @@ -0,0 +1,15 @@ +WITH DevClub AS (SELECT *, STRFTIME('%Y-%m-%d', HIRED) AS new_date + FROM master + WHERE new_date <= DATE('now', '-3 year') + AND POSITION IN ('Airhostess', 'Pilot', 'Steward') + AND STATUS IN (1, 2) + ORDER BY new_date DESC) +SELECT * +FROM DevClub WHERE STATUS IN (1, 2); + + +SELECT * FROM master WHERE STATUS IN (1, 2); + +SELECT NATIONALITY FROM master GROUP BY NATIONALITY; + +SELECT LOWER(NATIONALITY) FROM master GROUP by NATIONALITY; \ No newline at end of file diff --git a/src/query_more_than_3years.sql b/src/query_more_than_3years.sql index 1bb7c9b..938bef3 100644 --- a/src/query_more_than_3years.sql +++ b/src/query_more_than_3years.sql @@ -1,8 +1,15 @@ -WITH DevClub AS (SELECT *, STRFTIME('%Y-%m-%d', HIRED) AS new_date - FROM master - WHERE new_date <= DATE('now', '-3 year') - AND POSITION IN ('Airhostess', 'Pilot', 'Steward') - AND STATUS = 1 - ORDER BY new_date DESC) -SELECT * -FROM DevClub \ No newline at end of file +SELECT HIRED, DATE('now') AS NOW, DATE('now') - HIRED AS DIFF FROM master; + + +WITH test AS ( + select substr('10-11-2019', 7, 4) as year + , substr('10-11-2019', 4, 2) as month + , substr('10-11-2019', 1, 2) as date + , DATE(substr('10-11-2019', 7, 4) + || '-' + || substr('10-11-2019', 4, 2) + || '-' + || substr('10-11-2019', 1, 2)) as HIRE, + DATE('now') AS NOW +) +SELECT *, DATE('now') - HIRE AS DIFF FROM test \ No newline at end of file From b238cfffca658e0bf822671df6e3c0492a8dd698 Mon Sep 17 00:00:00 2001 From: kongphop Date: Sun, 9 Oct 2022 10:09:15 +0700 Subject: [PATCH 10/16] init script --- Makefile | 14 ++++++++++++++ src/date_utils.py | 27 +++++++++++++++++++++++++++ src/json_utils.py | 12 ++++++++++++ src/query_more_than_3years.sql | 28 ++++++++++++++-------------- 4 files changed, 67 insertions(+), 14 deletions(-) create mode 100644 Makefile create mode 100644 src/date_utils.py create mode 100644 src/json_utils.py diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..cc249ae --- /dev/null +++ b/Makefile @@ -0,0 +1,14 @@ +convert_xml: + python src/date_utils.py + +create_db: + python xxxx + +clean_db: + python xxx + +insert_db: + python xxx + +generate_csv: + python xxx \ No newline at end of file diff --git a/src/date_utils.py b/src/date_utils.py new file mode 100644 index 0000000..bb07bc7 --- /dev/null +++ b/src/date_utils.py @@ -0,0 +1,27 @@ +from datetime import datetime + + +def check_leap_year(year: int): + if year % 400 == 0 or year % 100 != 0 and year % 4 == 0: + return True + else: + return False + + +def check_hired_greater_than_3year(hired: datetime): + current = datetime.now() + diff_year = current.year - hired.year + if diff_year >= 3: + return True + + days_per_month = 366 / 12 if check_leap_year(hired.year) else 365 / 12 + current_days = (days_per_month * current.month) + current.day + hired_days = (days_per_month * hired.month) + hired.day + if current_days - hired_days == 0: + return True + + return False + + +if __name__ == "__main__": + print(check_hired_greater_than_3year(datetime.strptime("2020-10-09", "%Y-%m-%d"))) diff --git a/src/json_utils.py b/src/json_utils.py new file mode 100644 index 0000000..62d8865 --- /dev/null +++ b/src/json_utils.py @@ -0,0 +1,12 @@ +import json +from typing import List + + +def create_json_from_list_of_dict(data: List[dict]) -> str: + json.dumps(data) + return "filename" + + +if __name__ == "__main__": + # TODO + pass diff --git a/src/query_more_than_3years.sql b/src/query_more_than_3years.sql index 938bef3..cbdf040 100644 --- a/src/query_more_than_3years.sql +++ b/src/query_more_than_3years.sql @@ -1,15 +1,15 @@ -SELECT HIRED, DATE('now') AS NOW, DATE('now') - HIRED AS DIFF FROM master; +SELECT HIRED, DATE('now') AS NOW, DATE('now') - HIRED AS DIFF FROM master WHERE DIFF >= 3; - -WITH test AS ( - select substr('10-11-2019', 7, 4) as year - , substr('10-11-2019', 4, 2) as month - , substr('10-11-2019', 1, 2) as date - , DATE(substr('10-11-2019', 7, 4) - || '-' - || substr('10-11-2019', 4, 2) - || '-' - || substr('10-11-2019', 1, 2)) as HIRE, - DATE('now') AS NOW -) -SELECT *, DATE('now') - HIRE AS DIFF FROM test \ No newline at end of file +-- +-- WITH test AS ( +-- select substr('10-11-2019', 7, 4) as year +-- , substr('10-11-2019', 4, 2) as month +-- , substr('10-11-2019', 1, 2) as date +-- , DATE(substr('10-11-2019', 7, 4) +-- || '-' +-- || substr('10-11-2019', 4, 2) +-- || '-' +-- || substr('10-11-2019', 1, 2)) as HIRE, +-- DATE('now') AS NOW +-- ) +-- SELECT *, DATE('now') - HIRE AS DIFF FROM test \ No newline at end of file From 422055795c0af69386dcf8929644cc7262bc10a9 Mon Sep 17 00:00:00 2001 From: pynsuphasueb Date: Sun, 9 Oct 2022 11:07:04 +0700 Subject: [PATCH 11/16] Add delete table and delete data function --- src/insert_sqlite.py | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/src/insert_sqlite.py b/src/insert_sqlite.py index 8acabe5..315ba90 100644 --- a/src/insert_sqlite.py +++ b/src/insert_sqlite.py @@ -13,8 +13,10 @@ def create_table(table_name: str): DEPT TEXT, POSITION TEXT, STATUS INT, REGION TEXT)''') sqlite_connection.commit() cursor.close() + except sqlite3.Error as error: - print("create failed", error) + print("create table failed", error) + finally: if sqlite_connection: sqlite_connection.close() @@ -41,3 +43,39 @@ def insert_data(table_name: str, data: List[dict]): if sqlite_connection: sqlite_connection.close() print("database.close") + + +def delete_table(table_name: str): + try: + sqlite_connection = sqlite3.connect('sql_lite.db') + cursor = sqlite_connection.cursor() + print("connect success") + cursor.execute(f'''DROP TABLE IF EXISTS {table_name}''') + sqlite_connection.commit() + cursor.close() + + except sqlite3.Error as error: + print("delete table failed", error) + + finally: + if sqlite_connection: + sqlite_connection.close() + print("database.close") + + +def delete_data(table_name: str): + try: + sqlite_connection = sqlite3.connect('sql_lite.db') + cursor = sqlite_connection.cursor() + print("connect success") + cursor.execute(f'''DELETE FROM {table_name}''') + sqlite_connection.commit() + cursor.close() + + except sqlite3.Error as error: + print("delete data failed", error) + + finally: + if sqlite_connection: + sqlite_connection.close() + print("database.close") From 404ab8bd2b807b277098c708a4f9f4673423e391 Mon Sep 17 00:00:00 2001 From: kongphop Date: Sun, 9 Oct 2022 13:45:03 +0700 Subject: [PATCH 12/16] clean code --- Makefile | 23 ++++---- dev_club.json | 1 + main.py | 19 ------ resources/dev_club.csv | 13 +++++ resources/dev_club.json | 1 + resources/dev_mountain.csv | 89 +++++++++++++++++++++++++++++ scripts/query_by_department.sql | 1 + scripts/query_by_nationality.sql | 1 + scripts/query_by_region.sql | 1 + sql_lite.db | Bin 20480 -> 8192 bytes src/clean_table.py | 27 +++++++++ src/convert_xml_to_csv.py | 75 ++++++++++++++++++++++++ src/create_table.py | 31 ++++++++++ src/csv_file_handle.py | 0 src/csv_to_db.py | 39 +++++++++++++ src/data_handle.py | 0 src/date_utils.py | 27 --------- src/generate_csv_by_nationality.py | 46 +++++++++++++++ src/generate_json.py | 17 ++++++ src/insert_sqlite.py | 81 -------------------------- src/json_utils.py | 12 ---- src/query_by_department.sql | 8 --- src/query_by_nationality.sql | 8 --- src/query_by_region.sql | 0 src/query_filter_wrong_data.sql | 15 ----- src/query_more_than_3years.sql | 15 ----- src/xml_file_handle.py | 16 ------ 27 files changed, 355 insertions(+), 211 deletions(-) create mode 100644 dev_club.json delete mode 100644 main.py create mode 100644 resources/dev_club.csv create mode 100644 resources/dev_club.json create mode 100644 resources/dev_mountain.csv create mode 100644 scripts/query_by_department.sql create mode 100644 scripts/query_by_nationality.sql create mode 100644 scripts/query_by_region.sql create mode 100644 src/clean_table.py create mode 100644 src/convert_xml_to_csv.py create mode 100644 src/create_table.py delete mode 100644 src/csv_file_handle.py create mode 100644 src/csv_to_db.py delete mode 100644 src/data_handle.py delete mode 100644 src/date_utils.py create mode 100644 src/generate_csv_by_nationality.py create mode 100644 src/generate_json.py delete mode 100644 src/insert_sqlite.py delete mode 100644 src/json_utils.py delete mode 100644 src/query_by_department.sql delete mode 100644 src/query_by_nationality.sql delete mode 100644 src/query_by_region.sql delete mode 100644 src/query_filter_wrong_data.sql delete mode 100644 src/query_more_than_3years.sql delete mode 100644 src/xml_file_handle.py diff --git a/Makefile b/Makefile index cc249ae..4d87cdb 100644 --- a/Makefile +++ b/Makefile @@ -1,14 +1,17 @@ -convert_xml: - python src/date_utils.py +convert_xml_to_csv: + python src/convert_xml_to_csv.py "resources/data-devclub-1.xml" "resources" -create_db: - python xxxx +create_table: + python src/create_table.py "./sql_lite.db" "dev_club" -clean_db: - python xxx +clean_table: + python src/clean_table.py "./sql_lite.db" "dev_club" -insert_db: - python xxx +csv_to_db: + python src/csv_to_db.py "./sql_lite.db" "dev_club" "resources/dev_club.csv" -generate_csv: - python xxx \ No newline at end of file +generate_json: + python src/generate_json.py "resources/dev_club.csv" "resources/dev_club.json" + +generate_csv_by_nationality: + python src/generate_csv_by_nationality.py "resources/data-devclub-1.xml" "resources/by_nationality" \ No newline at end of file diff --git a/dev_club.json b/dev_club.json new file mode 100644 index 0000000..94577f5 --- /dev/null +++ b/dev_club.json @@ -0,0 +1 @@ +[{"EMPID": "3", "PASSPORT": "JUI65YBK7AF", "FIRSTNAME": "Jada", "LASTNAME": "Bender", "GENDER": "0", "BIRTHDAY": "1963-05-28", "NATIONALITY": "Pakistan", "HIRED": "2001-02-11", "DEPT": "Pilot", "POSITION": "Pilot", "STATUS": "1", "REGION": "Canada"}, {"EMPID": "5", "PASSPORT": "AZE20CSG4MU", "FIRSTNAME": "Lillian", "LASTNAME": "Reese", "GENDER": "0", "BIRTHDAY": "1982-12-03", "NATIONALITY": "Ukraine", "HIRED": "2002-05-19", "DEPT": "Flight Planning", "POSITION": "Steward", "STATUS": "1", "REGION": "Canada"}, {"EMPID": "23", "PASSPORT": "NFH65BYM0VB", "FIRSTNAME": "Armand", "LASTNAME": "Horn", "GENDER": "0", "BIRTHDAY": "1987-05-24", "NATIONALITY": "Netherlands", "HIRED": "2007-06-19", "DEPT": "Aircraft Maintenance", "POSITION": "Airhostess", "STATUS": "1", "REGION": "Ocenia"}, {"EMPID": "29", "PASSPORT": "CMK62UAD3VK", "FIRSTNAME": "Rowan", "LASTNAME": "Leonard", "GENDER": "1", "BIRTHDAY": "1974-07-15", "NATIONALITY": "Germany", "HIRED": "2004-03-27", "DEPT": "Aircraft Maintenance", "POSITION": "Pilot", "STATUS": "1", "REGION": "Ocenia"}, {"EMPID": "33", "PASSPORT": "EWD45RJW5YK", "FIRSTNAME": "Carter", "LASTNAME": "Velasquez", "GENDER": "0", "BIRTHDAY": "1967-11-23", "NATIONALITY": "Indonesia", "HIRED": "2005-02-27", "DEPT": "Flight Planning", "POSITION": "Pilot", "STATUS": "1", "REGION": "APAC"}, {"EMPID": "34", "PASSPORT": "BFS82MEY3CX", "FIRSTNAME": "Selma", "LASTNAME": "Bush", "GENDER": "0", "BIRTHDAY": "1972-03-26", "NATIONALITY": "Italy", "HIRED": "2008-10-10", "DEPT": "Flight Attendance", "POSITION": "Airhostess", "STATUS": "1", "REGION": "USA"}, {"EMPID": "50", "PASSPORT": "MRC33GHJ2KW", "FIRSTNAME": "Calvin", "LASTNAME": "Roach", "GENDER": "1", "BIRTHDAY": "1999-04-16", "NATIONALITY": "Mexico", "HIRED": "2011-03-18", "DEPT": "Flight Attendance", "POSITION": "Steward", "STATUS": "1", "REGION": "Europe"}, {"EMPID": "66", "PASSPORT": "WKV12UQC6QF", "FIRSTNAME": "Zachery", "LASTNAME": "Valentine", "GENDER": "0", "BIRTHDAY": "1971-06-04", "NATIONALITY": "Philippines", "HIRED": "2011-08-25", "DEPT": "Flight Attendance", "POSITION": "Steward", "STATUS": "1", "REGION": "Middle East"}, {"EMPID": "80", "PASSPORT": "EUC74ENE9ZK", "FIRSTNAME": "Ryan", "LASTNAME": "Rush", "GENDER": "0", "BIRTHDAY": "1998-06-13", "NATIONALITY": "Italy", "HIRED": "2019-07-31", "DEPT": "Aircraft Maintenance", "POSITION": "Pilot", "STATUS": "1", "REGION": "Middle East"}, {"EMPID": "93", "PASSPORT": "UXL43IOW6OV", "FIRSTNAME": "Honorato", "LASTNAME": "Maxwell", "GENDER": "1", "BIRTHDAY": "1982-03-09", "NATIONALITY": "France", "HIRED": "2017-02-04", "DEPT": "Aircraft Maintenance", "POSITION": "Airhostess", "STATUS": "1", "REGION": "Europe"}, {"EMPID": "95", "PASSPORT": "OUP31WOE2IE", "FIRSTNAME": "Dara", "LASTNAME": "Wilcox", "GENDER": "1", "BIRTHDAY": "1996-06-29", "NATIONALITY": "Singapore", "HIRED": "2011-05-18", "DEPT": "Flight Attendance", "POSITION": "Airhostess", "STATUS": "1", "REGION": "Canada"}, {"EMPID": "97", "PASSPORT": "SUF73DKV4QE", "FIRSTNAME": "Dante", "LASTNAME": "Hart", "GENDER": "0", "BIRTHDAY": "1999-12-21", "NATIONALITY": "Peru", "HIRED": "2016-02-22", "DEPT": "Pilot", "POSITION": "Pilot", "STATUS": "1", "REGION": "Europe"}] \ No newline at end of file diff --git a/main.py b/main.py deleted file mode 100644 index 4450070..0000000 --- a/main.py +++ /dev/null @@ -1,19 +0,0 @@ -from datetime import datetime, timedelta - -from src.insert_sqlite import insert_data, create_table -from src.xml_file_handle import read_file - -if __name__ == "__main__": - a = datetime.strptime("2005-02-20", "%Y-%m-%d") - b = datetime.now() - timedelta(year=3) - print(a - b) - -# if __name__ == "__main__": -# data = read_file('resources/data-devclub-1.xml') -# anomaly_idx = [] -# for idx, elm in enumerate(data): -# data[idx]["BIRTHDAY"] = datetime.strptime(elm["BIRTHDAY"], "%d-%m-%Y").strftime("%Y-%m-%d") -# data[idx]["HIRED"] = datetime.strptime(elm["HIRED"], "%d-%m-%Y").strftime("%Y-%m-%d") -# create_table("master") -# insert_data("master", data) diff --git a/resources/dev_club.csv b/resources/dev_club.csv new file mode 100644 index 0000000..2643c33 --- /dev/null +++ b/resources/dev_club.csv @@ -0,0 +1,13 @@ +EMPID,PASSPORT,FIRSTNAME,LASTNAME,GENDER,BIRTHDAY,NATIONALITY,HIRED,DEPT,POSITION,STATUS,REGION +3,JUI65YBK7AF,Jada,Bender,0,1963-05-28,Pakistan,2001-02-11,Pilot,Pilot,1,Canada +5,AZE20CSG4MU,Lillian,Reese,0,1982-12-03,Ukraine,2002-05-19,Flight Planning,Steward,1,Canada +23,NFH65BYM0VB,Armand,Horn,0,1987-05-24,Netherlands,2007-06-19,Aircraft Maintenance,Airhostess,1,Ocenia +29,CMK62UAD3VK,Rowan,Leonard,1,1974-07-15,Germany,2004-03-27,Aircraft Maintenance,Pilot,1,Ocenia +33,EWD45RJW5YK,Carter,Velasquez,0,1967-11-23,Indonesia,2005-02-27,Flight Planning,Pilot,1,APAC +34,BFS82MEY3CX,Selma,Bush,0,1972-03-26,Italy,2008-10-10,Flight Attendance,Airhostess,1,USA +50,MRC33GHJ2KW,Calvin,Roach,1,1999-04-16,Mexico,2011-03-18,Flight Attendance,Steward,1,Europe +66,WKV12UQC6QF,Zachery,Valentine,0,1971-06-04,Philippines,2011-08-25,Flight Attendance,Steward,1,Middle East +80,EUC74ENE9ZK,Ryan,Rush,0,1998-06-13,Italy,2019-07-31,Aircraft Maintenance,Pilot,1,Middle East +93,UXL43IOW6OV,Honorato,Maxwell,1,1982-03-09,France,2017-02-04,Aircraft Maintenance,Airhostess,1,Europe +95,OUP31WOE2IE,Dara,Wilcox,1,1996-06-29,Singapore,2011-05-18,Flight Attendance,Airhostess,1,Canada +97,SUF73DKV4QE,Dante,Hart,0,1999-12-21,Peru,2016-02-22,Pilot,Pilot,1,Europe diff --git a/resources/dev_club.json b/resources/dev_club.json new file mode 100644 index 0000000..94577f5 --- /dev/null +++ b/resources/dev_club.json @@ -0,0 +1 @@ +[{"EMPID": "3", "PASSPORT": "JUI65YBK7AF", "FIRSTNAME": "Jada", "LASTNAME": "Bender", "GENDER": "0", "BIRTHDAY": "1963-05-28", "NATIONALITY": "Pakistan", "HIRED": "2001-02-11", "DEPT": "Pilot", "POSITION": "Pilot", "STATUS": "1", "REGION": "Canada"}, {"EMPID": "5", "PASSPORT": "AZE20CSG4MU", "FIRSTNAME": "Lillian", "LASTNAME": "Reese", "GENDER": "0", "BIRTHDAY": "1982-12-03", "NATIONALITY": "Ukraine", "HIRED": "2002-05-19", "DEPT": "Flight Planning", "POSITION": "Steward", "STATUS": "1", "REGION": "Canada"}, {"EMPID": "23", "PASSPORT": "NFH65BYM0VB", "FIRSTNAME": "Armand", "LASTNAME": "Horn", "GENDER": "0", "BIRTHDAY": "1987-05-24", "NATIONALITY": "Netherlands", "HIRED": "2007-06-19", "DEPT": "Aircraft Maintenance", "POSITION": "Airhostess", "STATUS": "1", "REGION": "Ocenia"}, {"EMPID": "29", "PASSPORT": "CMK62UAD3VK", "FIRSTNAME": "Rowan", "LASTNAME": "Leonard", "GENDER": "1", "BIRTHDAY": "1974-07-15", "NATIONALITY": "Germany", "HIRED": "2004-03-27", "DEPT": "Aircraft Maintenance", "POSITION": "Pilot", "STATUS": "1", "REGION": "Ocenia"}, {"EMPID": "33", "PASSPORT": "EWD45RJW5YK", "FIRSTNAME": "Carter", "LASTNAME": "Velasquez", "GENDER": "0", "BIRTHDAY": "1967-11-23", "NATIONALITY": "Indonesia", "HIRED": "2005-02-27", "DEPT": "Flight Planning", "POSITION": "Pilot", "STATUS": "1", "REGION": "APAC"}, {"EMPID": "34", "PASSPORT": "BFS82MEY3CX", "FIRSTNAME": "Selma", "LASTNAME": "Bush", "GENDER": "0", "BIRTHDAY": "1972-03-26", "NATIONALITY": "Italy", "HIRED": "2008-10-10", "DEPT": "Flight Attendance", "POSITION": "Airhostess", "STATUS": "1", "REGION": "USA"}, {"EMPID": "50", "PASSPORT": "MRC33GHJ2KW", "FIRSTNAME": "Calvin", "LASTNAME": "Roach", "GENDER": "1", "BIRTHDAY": "1999-04-16", "NATIONALITY": "Mexico", "HIRED": "2011-03-18", "DEPT": "Flight Attendance", "POSITION": "Steward", "STATUS": "1", "REGION": "Europe"}, {"EMPID": "66", "PASSPORT": "WKV12UQC6QF", "FIRSTNAME": "Zachery", "LASTNAME": "Valentine", "GENDER": "0", "BIRTHDAY": "1971-06-04", "NATIONALITY": "Philippines", "HIRED": "2011-08-25", "DEPT": "Flight Attendance", "POSITION": "Steward", "STATUS": "1", "REGION": "Middle East"}, {"EMPID": "80", "PASSPORT": "EUC74ENE9ZK", "FIRSTNAME": "Ryan", "LASTNAME": "Rush", "GENDER": "0", "BIRTHDAY": "1998-06-13", "NATIONALITY": "Italy", "HIRED": "2019-07-31", "DEPT": "Aircraft Maintenance", "POSITION": "Pilot", "STATUS": "1", "REGION": "Middle East"}, {"EMPID": "93", "PASSPORT": "UXL43IOW6OV", "FIRSTNAME": "Honorato", "LASTNAME": "Maxwell", "GENDER": "1", "BIRTHDAY": "1982-03-09", "NATIONALITY": "France", "HIRED": "2017-02-04", "DEPT": "Aircraft Maintenance", "POSITION": "Airhostess", "STATUS": "1", "REGION": "Europe"}, {"EMPID": "95", "PASSPORT": "OUP31WOE2IE", "FIRSTNAME": "Dara", "LASTNAME": "Wilcox", "GENDER": "1", "BIRTHDAY": "1996-06-29", "NATIONALITY": "Singapore", "HIRED": "2011-05-18", "DEPT": "Flight Attendance", "POSITION": "Airhostess", "STATUS": "1", "REGION": "Canada"}, {"EMPID": "97", "PASSPORT": "SUF73DKV4QE", "FIRSTNAME": "Dante", "LASTNAME": "Hart", "GENDER": "0", "BIRTHDAY": "1999-12-21", "NATIONALITY": "Peru", "HIRED": "2016-02-22", "DEPT": "Pilot", "POSITION": "Pilot", "STATUS": "1", "REGION": "Europe"}] \ No newline at end of file diff --git a/resources/dev_mountain.csv b/resources/dev_mountain.csv new file mode 100644 index 0000000..0ebd382 --- /dev/null +++ b/resources/dev_mountain.csv @@ -0,0 +1,89 @@ +EMPID,PASSPORT,FIRSTNAME,LASTNAME,GENDER,BIRTHDAY,NATIONALITY,HIRED,DEPT,POSITION,STATUS,REGION +1,OQI75XIE4UX,Christopher,Kennedy,1,1978-02-05,South Korea,2005-02-20,Flight Planning,Steward,2,Europe +2,CDC87ETW8EQ,Burton,Gallegos,0,1960-09-22,Germany,2021-10-29,Aircraft Maintenance,Pilot,1,APAC +4,CYB72WYU6UR,Winter,Blair,0,1993-02-14,Austria,2022-03-24,Pilot,Steward,4,Ocenia +6,KXU40SKR1YO,Simone,Mosley,0,1994-11-20,Norway,2023-03-10,Flight Planning,Steward,2,Canada +7,SBJ34IXU7TC,Madeson,Mcintosh,1,1997-11-03,Mexico,2007-08-22,Flight Attendance,Steward,0,Ocenia +8,UCT91SOT6EN,Josephine,Hansen,1,1982-10-12,United States,2021-12-24,Flight Planning,Pilot,4,Middle East +9,WOW94MLI6CM,Prescott,Dudley,0,1990-04-07,Sweden,2012-11-16,Pilot,Steward,2,Canada +10,YHF52IXT9VG,Lamar,Reeves,1,1988-09-13,Philippines,2003-09-26,Flight Attendance,Pilot,2,Canada +11,LBI65YUK1BG,Hamilton,Duffy,1,1987-11-09,Vietnam,2021-12-31,Aircraft Maintenance,Steward,4,APAC +12,KGM77GAL2UW,Levi,Atkinson,0,1969-10-08,Sweden,2002-09-13,Aircraft Maintenance,Steward,4,Europe +13,UOM66JXI0ZD,Levi,Myers,0,1998-12-29,Sweden,2004-09-13,Aircraft Maintenance,Steward,0,Europe +14,TAP82QBU5PN,Lunea,Sweet,1,1992-10-27,Netherlands,2004-03-15,Pilot,Airhostess,3,Middle East +15,MOJ66TSD0LH,Jade,Simmons,1,1961-03-04,Costa Rica,2000-12-24,Aircraft Maintenance,Steward,0,Canada +16,WRS57BWI1RG,Serina,Tran,1,1980-11-28,Sweden,2010-07-18,Flight Planning,Steward,2,Canada +17,TZU74JZT1GC,Talon,Santiago,1,1969-04-17,United States,2015-09-02,Aircraft Maintenance,Steward,0,Canada +18,DFE84WHT0ED,Joelle,Boyle,0,1962-07-19,Germany,2013-03-28,Flight Planning,Airhostess,0,Ocenia +19,SYT22ZIA2ZU,Thaddeus,Martinez,1,1975-04-02,Costa Rica,2015-07-11,Flight Attendance,Steward,0,Middle East +20,JDS74VWV5XG,Lester,Edwards,1,1973-10-11,India,2000-09-03,Flight Planning,Airhostess,0,Canada +21,SMN51EPH5FE,Aline,Riley,0,1989-06-04,India,2001-04-05,Flight Attendance,Pilot,3,APAC +22,SOM23XJR5NC,Igor,Ochoa,1,1972-10-11,Colombia,2005-11-02,Flight Planning,Airhostess,4,APAC +24,EQI56KFP6NU,Chaney,Ramsey,1,1972-06-13,South Africa,2002-12-19,Aircraft Maintenance,Steward,2,USA +25,BJQ37WBQ4UL,Leandra,Mayer,0,1974-09-07,Philippines,2019-09-17,Pilot,Steward,0,Europe +26,CCE27MGJ8KI,Chloe,Blanchard,1,1998-12-29,Russian Federation,2001-05-20,Pilot,Steward,2,Middle East +27,EDF66USR7HP,Anjolie,Dudley,1,1975-12-27,United Kingdom,2004-07-28,Aircraft Maintenance,Steward,0,USA +28,VSN53SUD8EA,Lana,Aguirre,1,1979-10-30,Pakistan,2020-09-16,Flight Attendance,Pilot,2,Middle East +30,WJE55UKG3YU,Clarke,Norman,1,1987-06-15,Pakistan,2022-01-13,Aircraft Maintenance,Steward,3,USA +31,JBK92QBQ9CF,Kyra,Noel,1,1972-08-25,China,2005-11-27,Flight Attendance,Airhostess,3,Canada +32,KUO96QIG4VK,Stephen,Dickson,0,1962-05-02,Netherlands,2013-03-15,Aircraft Maintenance,Airhostess,4,APAC +35,XPI62OGX6QX,Roary,Frank,1,1979-12-30,South Korea,2008-11-12,Flight Attendance,Airhostess,2,Middle East +36,TLM36YPP3NE,Vera,Ashley,1,1982-06-02,Peru,2022-03-12,Flight Attendance,Pilot,3,Canada +37,GWY17TOL2UG,Matthew,Vasquez,1,1995-03-17,Ireland,2007-07-01,Flight Planning,Steward,4,Ocenia +38,KMG07QVW7MP,Kylynn,Mullins,0,1979-04-19,Vietnam,2020-11-07,Aircraft Maintenance,Steward,0,Middle East +39,DDI37UIV8QD,Trevor,Wyatt,0,1998-02-14,Turkey,2010-03-15,Pilot,Airhostess,2,USA +40,JHJ72ODJ7RA,Gregory,Bryant,0,1968-09-14,Austria,2017-01-10,Flight Planning,Pilot,0,Middle East +41,ITS61SWZ4PW,Duncan,Morrison,1,1975-04-24,Mexico,2012-03-01,Flight Planning,Steward,0,Europe +42,QSP69GYO0YK,Rajah,Roach,0,1992-12-13,Costa Rica,2011-05-26,Flight Attendance,Pilot,0,Europe +43,JWF56EYP2AN,Sophia,Fuller,1,1986-01-03,Peru,2012-02-15,Pilot,Steward,0,Europe +44,VTF75CUM7PC,Rhea,Keith,0,2000-06-28,Costa Rica,2010-10-30,Flight Attendance,Airhostess,4,Canada +45,MIF51GHC3PF,Walker,Jarvis,0,1988-06-26,Philippines,2004-04-22,Aircraft Maintenance,Pilot,3,Ocenia +46,ZGJ51FDM2LC,Reese,Christensen,0,1993-09-15,Turkey,2011-08-10,Aircraft Maintenance,Pilot,3,Ocenia +47,CQW50GAD3DS,Martin,Payne,1,1961-05-12,Austria,2015-10-07,Pilot,Pilot,4,Ocenia +48,MKI89CUF6PR,Fuller,Alvarez,0,1988-01-06,Austria,2016-12-30,Flight Attendance,Pilot,4,APAC +49,PRX53TYM5LT,Macon,Trevino,1,1997-10-01,Colombia,2019-12-17,Flight Planning,Steward,0,Ocenia +51,BPO49TXH0XX,Charles,Kim,0,1968-12-30,South Africa,2015-09-12,Flight Planning,Pilot,2,Ocenia +52,THN13DDU7PZ,Kieran,Hancock,1,1976-07-01,Italy,2023-04-14,Flight Planning,Airhostess,0,USA +53,EKI78MBL1DM,Irene,Moon,0,1973-10-02,United Kingdom,2015-04-21,Flight Attendance,Airhostess,2,USA +54,ZCM30CQE2UN,Noelani,Watkins,0,1969-08-31,United Kingdom,2016-07-18,Aircraft Maintenance,Airhostess,4,Europe +55,JJG71FLY1XR,Paula,Delaney,0,1986-09-18,Brazil,2003-01-29,Aircraft Maintenance,Steward,2,Middle East +56,UWS82URG4LM,Keelie,Crosby,0,1985-07-17,Vietnam,2002-04-01,Flight Planning,Steward,0,USA +57,GRE66NCT2EF,Aimee,Stone,0,1990-09-08,Spain,2007-07-25,Flight Attendance,Pilot,3,Middle East +58,TZT98UWC8BW,Donna,Clay,1,1977-12-25,Peru,2003-05-16,Aircraft Maintenance,Steward,4,APAC +59,VDF94IVV1UX,Nomlanga,Stout,0,1975-04-03,China,2009-08-06,Flight Planning,Airhostess,0,Canada +60,IUE46AKB9OH,Yuri,Evans,1,1973-10-05,Vietnam,2022-04-18,Aircraft Maintenance,Airhostess,0,Ocenia +61,KGM73NWG1JP,Desirae,Melton,1,1993-11-07,Australia,2013-04-12,Aircraft Maintenance,Airhostess,0,Europe +62,LYL50VBA1GL,Armando,Moody,1,1989-04-24,Costa Rica,2020-04-15,Flight Planning,Steward,3,USA +63,UVV50TVB3TS,Maggy,Miles,0,1972-01-16,Mexico,2015-08-02,Flight Planning,Pilot,3,Ocenia +64,GSW02GPL6OY,Wyoming,Joyner,0,1991-11-20,Turkey,2022-04-17,Flight Attendance,Steward,0,Europe +65,UCZ18XLY9OA,Solomon,Estes,0,1968-07-16,Philippines,2014-02-08,Aircraft Maintenance,Airhostess,0,USA +67,BVY21SKG6CE,Kitra,Green,0,1967-07-10,Ireland,2006-09-12,Flight Planning,Airhostess,0,Middle East +68,GDJ74WSM7LG,Autumn,Page,0,1969-11-01,Brazil,2001-04-24,Aircraft Maintenance,Airhostess,3,Middle East +69,OOR56TFJ3XV,Nehru,Vargas,1,1976-09-25,Germany,2007-08-27,Flight Attendance,Pilot,2,USA +70,RAX87DEX6CC,Ferris,Houston,0,1981-05-01,Singapore,2016-02-23,Pilot,Pilot,3,Canada +71,FSQ47TYA9DJ,Pascale,Silva,0,1968-10-13,Netherlands,2007-09-27,Pilot,Steward,4,Canada +72,AUY27DLM5FK,Leilani,Moran,0,1996-08-25,Belgium,2005-04-08,Aircraft Maintenance,Airhostess,2,Ocenia +73,XIJ68PKR7QT,Darius,Serrano,0,1990-04-29,United States,2005-11-03,Pilot,Steward,4,Middle East +74,HJL93JJY5GH,September,Morin,1,1997-09-15,Mexico,2014-08-26,Aircraft Maintenance,Steward,4,APAC +75,KVI04NMS2QH,Shay,Mcdonald,1,1999-12-29,South Africa,2007-03-07,Aircraft Maintenance,Airhostess,4,Ocenia +76,YWT45VVP7KK,Nathan,Floyd,0,1988-01-04,Australia,2008-10-09,Flight Planning,Steward,3,USA +77,EOP89YXA3YW,Wayne,Bowman,0,1991-03-02,Vietnam,2007-03-28,Aircraft Maintenance,Steward,2,APAC +78,YHV05IUP6ER,Willa,Ferguson,0,1969-12-10,Italy,2017-07-08,Flight Planning,Steward,3,Ocenia +79,RCQ71JXX4NH,Teagan,Daniel,1,1983-09-02,United States,2005-05-22,Pilot,Steward,0,APAC +81,DCD61JXD7UO,Brady,Hernandez,1,1961-11-26,Russian Federation,2022-09-01,Pilot,Airhostess,2,Europe +82,ISX87UNW0AD,Herrod,Oliver,0,1965-01-07,Peru,2023-01-16,Flight Attendance,Airhostess,0,Europe +83,LJK19GHE1TM,Dalton,Roberson,0,1994-05-02,New Zealand,2012-06-21,Aircraft Maintenance,Airhostess,0,Europe +84,KMS88HTI5IR,Chanda,Wynn,1,1993-07-10,Indonesia,2014-11-20,Flight Planning,Steward,2,USA +85,MUE55VMY6MX,Solomon,Booker,0,1961-03-28,Nigeria,2007-09-18,Aircraft Maintenance,Steward,3,APAC +86,WND47SBT6OF,Yardley,Buckley,1,1989-06-24,Singapore,2002-06-04,Flight Attendance,Pilot,3,USA +87,RVO63HMC4NL,Ferris,Gilbert,0,1969-07-24,Peru,2002-12-25,Flight Planning,Steward,4,Europe +88,TRJ51LBJ6II,Shaeleigh,Roth,1,1986-02-04,India,2004-03-15,Aircraft Maintenance,Steward,4,Europe +89,PHE40UOS0GY,Amanda,Schwartz,1,1983-04-03,Vietnam,2019-08-06,Aircraft Maintenance,Steward,4,APAC +90,MCJ12FYX5KN,Maxine,Branch,1,1979-05-29,Norway,2018-10-17,Pilot,Steward,0,Europe +91,WEA16MFX7OE,Drew,Gordon,0,1981-10-31,Sweden,2015-04-19,Aircraft Maintenance,Steward,2,Ocenia +92,HET44XPQ0RR,Lucy,Finch,1,1975-02-21,Indonesia,2002-05-19,Pilot,Steward,4,Middle East +94,BVQ96KDP3EL,Darryl,Nichols,1,1988-05-29,Ukraine,2001-02-19,Aircraft Maintenance,Steward,0,USA +96,LJB26BQM6PS,Laith,Whitfield,0,1987-01-14,Russian Federation,2001-02-09,Pilot,Airhostess,0,APAC +98,DOB31QXV4GZ,Moana,Walsh,1,1995-05-03,Brazil,2002-04-21,Pilot,Airhostess,3,Ocenia +99,OUB92IKA7AU,Jonah,Solomon,1,1985-05-25,Pakistan,2023-04-30,Flight Attendance,Pilot,3,Europe +100,WIN16ELU8GN,Orlando,Mayer,0,1961-01-11,Austria,2003-04-07,Pilot,Pilot,0,APAC diff --git a/scripts/query_by_department.sql b/scripts/query_by_department.sql new file mode 100644 index 0000000..4c90c88 --- /dev/null +++ b/scripts/query_by_department.sql @@ -0,0 +1 @@ +SELECT * FROM dev_club WHERE DEPT = 'Flight Attendance'; \ No newline at end of file diff --git a/scripts/query_by_nationality.sql b/scripts/query_by_nationality.sql new file mode 100644 index 0000000..446485a --- /dev/null +++ b/scripts/query_by_nationality.sql @@ -0,0 +1 @@ +SELECT * FROM dev_club WHERE NATIONALITY = 'Italy'; \ No newline at end of file diff --git a/scripts/query_by_region.sql b/scripts/query_by_region.sql new file mode 100644 index 0000000..49f4ce9 --- /dev/null +++ b/scripts/query_by_region.sql @@ -0,0 +1 @@ +SELECT * FROM dev_club WHERE REGION = 'Italy'; \ No newline at end of file diff --git a/sql_lite.db b/sql_lite.db index 042f38c5daa2c5112b377c752269f43c949158fc..0a5986ece93e30263d9f9a710a133bddcb7313c7 100644 GIT binary patch delta 213 zcmZozz}Vn0L7J79fq{W(qJlj?FN0pV2Z+bW_lSY-(Z<3OKGP;?Ms{ⓈiL5lEkE( z)Rfe+_~e|@BpA))9OUX4;;Inh=;Y(7027@o&i_&YWDpN`4+H;t{y@H$d>wq6yytie zc$s+?^H_7=;O^O2n8VHF#WOj_%Zn+Id$N>wB2yaI5NR1&E#U3{23>|kn;xs;cYr2 literal 20480 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 iXQV9NZ%_!v%iWiIhqi@oBwlAzGXX(q;ZvQ= 3: + return True + + days_per_month = 366 / 12 if check_leap_year(hired.year) else 365 / 12 + current_days = (days_per_month * current.month) + current.day + hired_days = (days_per_month * hired.month) + hired.day + if current_days - hired_days == 0: + return True + + return False + + +def read_xml_to_list_of_dict(path: str) -> tuple[List[dict], List[dict]]: + tree = ET.parse(path) + root = tree.getroot() + dev_mountain = [] + dev_club = [] + for child in root.iter('record'): + row = {} + for elem in child.iter(): + if elem.tag == "record": + continue + + if elem.tag == "BIRTHDAY" or elem.tag == "HIRED": + row[elem.tag] = datetime.strptime(elem.text, "%d-%m-%Y").strftime("%Y-%m-%d") + continue + + row[elem.tag] = elem.text + if check_hired_greater_than_3year(row["HIRED"]) \ + and row["POSITION"] in ["Airhostess", "Pilot", "Steward"] \ + and row["STATUS"] == "1": + dev_club.append(row) + else: + dev_mountain.append(row) + return dev_mountain, dev_club + + +def convert_xml_to_csv(input_file_path: str, output_folder: str): + dev_mountain, dev_club = read_xml_to_list_of_dict(input_file_path) + columns = dev_mountain[0].keys() + with open(f'{output_folder}/dev_mountain.csv', 'w', newline='') as output_file: + dict_writer = csv.DictWriter(output_file, columns) + dict_writer.writeheader() + dict_writer.writerows(dev_mountain) + + columns = dev_club[0].keys() + with open(f'{output_folder}/dev_club.csv', 'w', newline='') as output_file: + dict_writer = csv.DictWriter(output_file, columns) + dict_writer.writeheader() + dict_writer.writerows(dev_club) + + +if __name__ == "__main__": + if len(sys.argv) == 3: + convert_xml_to_csv(input_file_path=sys.argv[1], output_folder=sys.argv[2]) + else: + print("Please insert param") diff --git a/src/create_table.py b/src/create_table.py new file mode 100644 index 0000000..cae1e33 --- /dev/null +++ b/src/create_table.py @@ -0,0 +1,31 @@ +import sqlite3 +import sys + + +def create_table(database_name: str, table_name: str): + try: + sqlite_connection = sqlite3.connect(database_name) + cursor = sqlite_connection.cursor() + print("connect success") + cursor.execute(f'''CREATE TABLE IF NOT EXISTS {table_name} + (EMPID INT, PASSPORT TEXT, FIRSTNAME TEXT, LASTNAME TEXT, + GENDER INT, BIRTHDAY TEXT, NATIONALITY TEXT, HIRED TEXT, + DEPT TEXT, POSITION TEXT, STATUS INT, REGION TEXT)''') + sqlite_connection.commit() + cursor.close() + + except sqlite3.Error as error: + print("create table failed", error) + + finally: + if sqlite_connection: + sqlite_connection.close() + print("database.close") + + +if __name__ == "__main__": + if len(sys.argv) == 3: + create_table(database_name=sys.argv[1], table_name=sys.argv[2]) + else: + print("Please insert param") + diff --git a/src/csv_file_handle.py b/src/csv_file_handle.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/csv_to_db.py b/src/csv_to_db.py new file mode 100644 index 0000000..2e6f615 --- /dev/null +++ b/src/csv_to_db.py @@ -0,0 +1,39 @@ +import csv +import sqlite3 +import sys +from typing import List + + +def insert_data(database_name: str, table_name: str, data: List[dict]): + try: + sqlite_connection = sqlite3.connect(database_name) + cursor = sqlite_connection.cursor() + print("connect success") + for val in data: + sqlite_insert_query = f"""INSERT INTO {table_name} + (EMPID, PASSPORT, FIRSTNAME, LASTNAME, GENDER, BIRTHDAY, + NATIONALITY, HIRED, DEPT, POSITION, STATUS, REGION) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);""" + count = cursor.execute(sqlite_insert_query, tuple(val.values())) + sqlite_connection.commit() + print("insert success", count) + cursor.close() + except sqlite3.Error as error: + print("insert failed", error) + finally: + if sqlite_connection: + sqlite_connection.close() + print("database.close") + + +def csv_to_sqlite(database_name: str, table_name: str, path: str): + with open(path) as f: + data = [{k: v for k, v in row.items()} for row in csv.DictReader(f, skipinitialspace=True)] + insert_data(database_name, table_name, data) + + +if __name__ == "__main__": + if len(sys.argv) == 4: + csv_to_sqlite(database_name=sys.argv[1], table_name=sys.argv[2], path=sys.argv[3]) + else: + print("Please insert param") diff --git a/src/data_handle.py b/src/data_handle.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/date_utils.py b/src/date_utils.py deleted file mode 100644 index bb07bc7..0000000 --- a/src/date_utils.py +++ /dev/null @@ -1,27 +0,0 @@ -from datetime import datetime - - -def check_leap_year(year: int): - if year % 400 == 0 or year % 100 != 0 and year % 4 == 0: - return True - else: - return False - - -def check_hired_greater_than_3year(hired: datetime): - current = datetime.now() - diff_year = current.year - hired.year - if diff_year >= 3: - return True - - days_per_month = 366 / 12 if check_leap_year(hired.year) else 365 / 12 - current_days = (days_per_month * current.month) + current.day - hired_days = (days_per_month * hired.month) + hired.day - if current_days - hired_days == 0: - return True - - return False - - -if __name__ == "__main__": - print(check_hired_greater_than_3year(datetime.strptime("2020-10-09", "%Y-%m-%d"))) diff --git a/src/generate_csv_by_nationality.py b/src/generate_csv_by_nationality.py new file mode 100644 index 0000000..4121176 --- /dev/null +++ b/src/generate_csv_by_nationality.py @@ -0,0 +1,46 @@ +import csv +import sys +import xml.etree.ElementTree as ET +from datetime import datetime +from itertools import groupby +from typing import List + + +def read_xml_to_list_of_dict(path: str) -> List[dict]: + tree = ET.parse(path) + root = tree.getroot() + data = [] + for child in root.iter('record'): + row = {} + for elem in child.iter(): + if elem.tag == "record": + continue + + if elem.tag == "BIRTHDAY" or elem.tag == "HIRED": + row[elem.tag] = datetime.strptime(elem.text, "%d-%m-%Y").strftime("%Y-%m-%d") + continue + + row[elem.tag] = elem.text + data.append(row) + return data + + +def generate_csv_by_nationality(input_file_path: str, output_folder: str): + obj = read_xml_to_list_of_dict(input_file_path) + obj.sort(key=lambda x: x['NATIONALITY']) + + for key, val in groupby(obj, key=lambda x: x['NATIONALITY']): + contents = list(val) + + columns = contents[0].keys() + with open(f'{output_folder}/{key}.csv', 'w', newline='') as output_file: + dict_writer = csv.DictWriter(output_file, columns) + dict_writer.writeheader() + dict_writer.writerows(contents) + + +if __name__ == "__main__": + if len(sys.argv) == 3: + generate_csv_by_nationality(input_file_path=sys.argv[1], output_folder=sys.argv[2]) + else: + print("Please insert param") diff --git a/src/generate_json.py b/src/generate_json.py new file mode 100644 index 0000000..90b9a6b --- /dev/null +++ b/src/generate_json.py @@ -0,0 +1,17 @@ +import csv +import json +import sys + + +def generate_json(path: str, json_file_name: str): + with open(path) as f: + data = [{k: v for k, v in row.items()} for row in csv.DictReader(f, skipinitialspace=True)] + with open(json_file_name, "w") as f: + json.dump(data, f) + + +if __name__ == "__main__": + if len(sys.argv) == 3: + generate_json(path=sys.argv[1], json_file_name=sys.argv[2]) + else: + print("Please insert param") diff --git a/src/insert_sqlite.py b/src/insert_sqlite.py deleted file mode 100644 index 315ba90..0000000 --- a/src/insert_sqlite.py +++ /dev/null @@ -1,81 +0,0 @@ -import sqlite3 -from typing import List - - -def create_table(table_name: str): - try: - sqlite_connection = sqlite3.connect('sql_lite.db') - cursor = sqlite_connection.cursor() - print("connect success") - cursor.execute(f'''CREATE TABLE IF NOT EXISTS {table_name} - (EMPID INT, PASSPORT TEXT, FIRSTNAME TEXT, LASTNAME TEXT, - GENDER INT, BIRTHDAY TEXT, NATIONALITY TEXT, HIRED TEXT, - DEPT TEXT, POSITION TEXT, STATUS INT, REGION TEXT)''') - sqlite_connection.commit() - cursor.close() - - except sqlite3.Error as error: - print("create table failed", error) - - finally: - if sqlite_connection: - sqlite_connection.close() - print("database.close") - - -def insert_data(table_name: str, data: List[dict]): - try: - sqlite_connection = sqlite3.connect('sql_lite.db') - cursor = sqlite_connection.cursor() - print("connect success") - for val in data: - sqlite_insert_query = f"""INSERT INTO {table_name} - (EMPID, PASSPORT, FIRSTNAME, LASTNAME, GENDER, BIRTHDAY, - NATIONALITY, HIRED, DEPT, POSITION, STATUS, REGION) - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);""" - count = cursor.execute(sqlite_insert_query, tuple(val.values())) - sqlite_connection.commit() - print("insert success", count) - cursor.close() - except sqlite3.Error as error: - print("insert failed", error) - finally: - if sqlite_connection: - sqlite_connection.close() - print("database.close") - - -def delete_table(table_name: str): - try: - sqlite_connection = sqlite3.connect('sql_lite.db') - cursor = sqlite_connection.cursor() - print("connect success") - cursor.execute(f'''DROP TABLE IF EXISTS {table_name}''') - sqlite_connection.commit() - cursor.close() - - except sqlite3.Error as error: - print("delete table failed", error) - - finally: - if sqlite_connection: - sqlite_connection.close() - print("database.close") - - -def delete_data(table_name: str): - try: - sqlite_connection = sqlite3.connect('sql_lite.db') - cursor = sqlite_connection.cursor() - print("connect success") - cursor.execute(f'''DELETE FROM {table_name}''') - sqlite_connection.commit() - cursor.close() - - except sqlite3.Error as error: - print("delete data failed", error) - - finally: - if sqlite_connection: - sqlite_connection.close() - print("database.close") diff --git a/src/json_utils.py b/src/json_utils.py deleted file mode 100644 index 62d8865..0000000 --- a/src/json_utils.py +++ /dev/null @@ -1,12 +0,0 @@ -import json -from typing import List - - -def create_json_from_list_of_dict(data: List[dict]) -> str: - json.dumps(data) - return "filename" - - -if __name__ == "__main__": - # TODO - pass diff --git a/src/query_by_department.sql b/src/query_by_department.sql deleted file mode 100644 index 6471504..0000000 --- a/src/query_by_department.sql +++ /dev/null @@ -1,8 +0,0 @@ -WITH DevClub AS (SELECT *, STRFTIME('%Y-%m-%d', HIRED) AS new_date - FROM master - WHERE new_date <= DATE('now', '-3 year') - AND POSITION IN ('Airhostess', 'Pilot', 'Steward') - AND STATUS = 1 - ORDER BY new_date DESC) -SELECT * -FROM DevClub WHERE DEPT = 'Flight Attendance' \ No newline at end of file diff --git a/src/query_by_nationality.sql b/src/query_by_nationality.sql deleted file mode 100644 index 4031147..0000000 --- a/src/query_by_nationality.sql +++ /dev/null @@ -1,8 +0,0 @@ -WITH DevClub AS (SELECT *, STRFTIME('%Y-%m-%d', HIRED) AS new_date - FROM master - WHERE new_date <= DATE('now', '-3 year') - AND POSITION IN ('Airhostess', 'Pilot', 'Steward') - AND STATUS = 1 - ORDER BY new_date DESC) -SELECT * -FROM DevClub WHERE NATIONALITY = 'Italy' \ No newline at end of file diff --git a/src/query_by_region.sql b/src/query_by_region.sql deleted file mode 100644 index e69de29..0000000 diff --git a/src/query_filter_wrong_data.sql b/src/query_filter_wrong_data.sql deleted file mode 100644 index 8418a35..0000000 --- a/src/query_filter_wrong_data.sql +++ /dev/null @@ -1,15 +0,0 @@ -WITH DevClub AS (SELECT *, STRFTIME('%Y-%m-%d', HIRED) AS new_date - FROM master - WHERE new_date <= DATE('now', '-3 year') - AND POSITION IN ('Airhostess', 'Pilot', 'Steward') - AND STATUS IN (1, 2) - ORDER BY new_date DESC) -SELECT * -FROM DevClub WHERE STATUS IN (1, 2); - - -SELECT * FROM master WHERE STATUS IN (1, 2); - -SELECT NATIONALITY FROM master GROUP BY NATIONALITY; - -SELECT LOWER(NATIONALITY) FROM master GROUP by NATIONALITY; \ No newline at end of file diff --git a/src/query_more_than_3years.sql b/src/query_more_than_3years.sql deleted file mode 100644 index cbdf040..0000000 --- a/src/query_more_than_3years.sql +++ /dev/null @@ -1,15 +0,0 @@ -SELECT HIRED, DATE('now') AS NOW, DATE('now') - HIRED AS DIFF FROM master WHERE DIFF >= 3; - --- --- WITH test AS ( --- select substr('10-11-2019', 7, 4) as year --- , substr('10-11-2019', 4, 2) as month --- , substr('10-11-2019', 1, 2) as date --- , DATE(substr('10-11-2019', 7, 4) --- || '-' --- || substr('10-11-2019', 4, 2) --- || '-' --- || substr('10-11-2019', 1, 2)) as HIRE, --- DATE('now') AS NOW --- ) --- SELECT *, DATE('now') - HIRE AS DIFF FROM test \ No newline at end of file diff --git a/src/xml_file_handle.py b/src/xml_file_handle.py deleted file mode 100644 index 3902a62..0000000 --- a/src/xml_file_handle.py +++ /dev/null @@ -1,16 +0,0 @@ -import xml.etree.ElementTree as ET -from typing import List - - -def read_file(path: str) -> List[dict]: - tree = ET.parse(path) - root = tree.getroot() - data = [] - for child in root.iter('record'): - d = {} - for x in child.iter(): - if x.tag == "record": - continue - d[x.tag] = x.text - data.append(d) - return data From 4ce3cf0f69e2bd968423a3f01de8041ea933a410 Mon Sep 17 00:00:00 2001 From: kongphop Date: Sun, 9 Oct 2022 13:47:49 +0700 Subject: [PATCH 13/16] update gitignore --- .gitignore | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 723ef36..4032ec7 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,5 @@ -.idea \ No newline at end of file +.idea + +.DS_Store + +__pycache__/ \ No newline at end of file From dc192f6a17dae26fa748a7777358962ec7dc7b4c Mon Sep 17 00:00:00 2001 From: kongphop Date: Sun, 9 Oct 2022 14:04:19 +0700 Subject: [PATCH 14/16] update --- README.md | 18 ++++++++++++++++++ dev_club.json | 1 - resources/by_nationality/Australia.csv | 3 +++ resources/by_nationality/Austria.csv | 6 ++++++ resources/by_nationality/Belgium.csv | 2 ++ resources/by_nationality/Brazil.csv | 4 ++++ resources/by_nationality/China.csv | 3 +++ resources/by_nationality/Colombia.csv | 3 +++ resources/by_nationality/Costa Rica.csv | 6 ++++++ resources/by_nationality/France.csv | 2 ++ resources/by_nationality/Germany.csv | 5 +++++ resources/by_nationality/India.csv | 4 ++++ resources/by_nationality/Indonesia.csv | 4 ++++ resources/by_nationality/Ireland.csv | 3 +++ resources/by_nationality/Italy.csv | 5 +++++ resources/by_nationality/Mexico.csv | 6 ++++++ resources/by_nationality/Netherlands.csv | 5 +++++ resources/by_nationality/New Zealand.csv | 2 ++ resources/by_nationality/Nigeria.csv | 2 ++ resources/by_nationality/Norway.csv | 3 +++ resources/by_nationality/Pakistan.csv | 5 +++++ resources/by_nationality/Peru.csv | 7 +++++++ resources/by_nationality/Philippines.csv | 6 ++++++ .../by_nationality/Russian Federation.csv | 4 ++++ resources/by_nationality/Singapore.csv | 4 ++++ resources/by_nationality/South Africa.csv | 4 ++++ resources/by_nationality/South Korea.csv | 3 +++ resources/by_nationality/Spain.csv | 2 ++ resources/by_nationality/Sweden.csv | 6 ++++++ resources/by_nationality/Turkey.csv | 4 ++++ resources/by_nationality/Ukraine.csv | 3 +++ resources/by_nationality/United Kingdom.csv | 4 ++++ resources/by_nationality/United States.csv | 5 +++++ resources/by_nationality/Vietnam.csv | 7 +++++++ src/convert_xml_to_csv.py | 11 ++++++++--- src/generate_csv_by_nationality.py | 4 ++++ 36 files changed, 162 insertions(+), 4 deletions(-) delete mode 100644 dev_club.json create mode 100644 resources/by_nationality/Australia.csv create mode 100644 resources/by_nationality/Austria.csv create mode 100644 resources/by_nationality/Belgium.csv create mode 100644 resources/by_nationality/Brazil.csv create mode 100644 resources/by_nationality/China.csv create mode 100644 resources/by_nationality/Colombia.csv create mode 100644 resources/by_nationality/Costa Rica.csv create mode 100644 resources/by_nationality/France.csv create mode 100644 resources/by_nationality/Germany.csv create mode 100644 resources/by_nationality/India.csv create mode 100644 resources/by_nationality/Indonesia.csv create mode 100644 resources/by_nationality/Ireland.csv create mode 100644 resources/by_nationality/Italy.csv create mode 100644 resources/by_nationality/Mexico.csv create mode 100644 resources/by_nationality/Netherlands.csv create mode 100644 resources/by_nationality/New Zealand.csv create mode 100644 resources/by_nationality/Nigeria.csv create mode 100644 resources/by_nationality/Norway.csv create mode 100644 resources/by_nationality/Pakistan.csv create mode 100644 resources/by_nationality/Peru.csv create mode 100644 resources/by_nationality/Philippines.csv create mode 100644 resources/by_nationality/Russian Federation.csv create mode 100644 resources/by_nationality/Singapore.csv create mode 100644 resources/by_nationality/South Africa.csv create mode 100644 resources/by_nationality/South Korea.csv create mode 100644 resources/by_nationality/Spain.csv create mode 100644 resources/by_nationality/Sweden.csv create mode 100644 resources/by_nationality/Turkey.csv create mode 100644 resources/by_nationality/Ukraine.csv create mode 100644 resources/by_nationality/United Kingdom.csv create mode 100644 resources/by_nationality/United States.csv create mode 100644 resources/by_nationality/Vietnam.csv diff --git a/README.md b/README.md index b98bf2a..0b8a8c2 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,23 @@ # hackathon-season2 +## How to use + +``` +cd hackathon-season2 + +make convert_xml_to_csv (**แปลงไฟล์ xml เป็น csv ชื่อ dev_club.csv กับ dev_mountain.csv**) + +make create_table (**สร้าง database และ table**) + +make clean_table (**ลบ data ออกจาก table**) + +make csv_to_db (**import dev_club.csv to database**) + +make generate_json (**สร้างไฟล์ dev_club.json**) + +make generate_csv_by_nationality (**สร้างไฟล์ csv แยกตาม nationality**) +``` + ## เลข Status จะมีตามนี้ครับ - 1 = Active - 2 = Resigned diff --git a/dev_club.json b/dev_club.json deleted file mode 100644 index 94577f5..0000000 --- a/dev_club.json +++ /dev/null @@ -1 +0,0 @@ -[{"EMPID": "3", "PASSPORT": "JUI65YBK7AF", "FIRSTNAME": "Jada", "LASTNAME": "Bender", "GENDER": "0", "BIRTHDAY": "1963-05-28", "NATIONALITY": "Pakistan", "HIRED": "2001-02-11", "DEPT": "Pilot", "POSITION": "Pilot", "STATUS": "1", "REGION": "Canada"}, {"EMPID": "5", "PASSPORT": "AZE20CSG4MU", "FIRSTNAME": "Lillian", "LASTNAME": "Reese", "GENDER": "0", "BIRTHDAY": "1982-12-03", "NATIONALITY": "Ukraine", "HIRED": "2002-05-19", "DEPT": "Flight Planning", "POSITION": "Steward", "STATUS": "1", "REGION": "Canada"}, {"EMPID": "23", "PASSPORT": "NFH65BYM0VB", "FIRSTNAME": "Armand", "LASTNAME": "Horn", "GENDER": "0", "BIRTHDAY": "1987-05-24", "NATIONALITY": "Netherlands", "HIRED": "2007-06-19", "DEPT": "Aircraft Maintenance", "POSITION": "Airhostess", "STATUS": "1", "REGION": "Ocenia"}, {"EMPID": "29", "PASSPORT": "CMK62UAD3VK", "FIRSTNAME": "Rowan", "LASTNAME": "Leonard", "GENDER": "1", "BIRTHDAY": "1974-07-15", "NATIONALITY": "Germany", "HIRED": "2004-03-27", "DEPT": "Aircraft Maintenance", "POSITION": "Pilot", "STATUS": "1", "REGION": "Ocenia"}, {"EMPID": "33", "PASSPORT": "EWD45RJW5YK", "FIRSTNAME": "Carter", "LASTNAME": "Velasquez", "GENDER": "0", "BIRTHDAY": "1967-11-23", "NATIONALITY": "Indonesia", "HIRED": "2005-02-27", "DEPT": "Flight Planning", "POSITION": "Pilot", "STATUS": "1", "REGION": "APAC"}, {"EMPID": "34", "PASSPORT": "BFS82MEY3CX", "FIRSTNAME": "Selma", "LASTNAME": "Bush", "GENDER": "0", "BIRTHDAY": "1972-03-26", "NATIONALITY": "Italy", "HIRED": "2008-10-10", "DEPT": "Flight Attendance", "POSITION": "Airhostess", "STATUS": "1", "REGION": "USA"}, {"EMPID": "50", "PASSPORT": "MRC33GHJ2KW", "FIRSTNAME": "Calvin", "LASTNAME": "Roach", "GENDER": "1", "BIRTHDAY": "1999-04-16", "NATIONALITY": "Mexico", "HIRED": "2011-03-18", "DEPT": "Flight Attendance", "POSITION": "Steward", "STATUS": "1", "REGION": "Europe"}, {"EMPID": "66", "PASSPORT": "WKV12UQC6QF", "FIRSTNAME": "Zachery", "LASTNAME": "Valentine", "GENDER": "0", "BIRTHDAY": "1971-06-04", "NATIONALITY": "Philippines", "HIRED": "2011-08-25", "DEPT": "Flight Attendance", "POSITION": "Steward", "STATUS": "1", "REGION": "Middle East"}, {"EMPID": "80", "PASSPORT": "EUC74ENE9ZK", "FIRSTNAME": "Ryan", "LASTNAME": "Rush", "GENDER": "0", "BIRTHDAY": "1998-06-13", "NATIONALITY": "Italy", "HIRED": "2019-07-31", "DEPT": "Aircraft Maintenance", "POSITION": "Pilot", "STATUS": "1", "REGION": "Middle East"}, {"EMPID": "93", "PASSPORT": "UXL43IOW6OV", "FIRSTNAME": "Honorato", "LASTNAME": "Maxwell", "GENDER": "1", "BIRTHDAY": "1982-03-09", "NATIONALITY": "France", "HIRED": "2017-02-04", "DEPT": "Aircraft Maintenance", "POSITION": "Airhostess", "STATUS": "1", "REGION": "Europe"}, {"EMPID": "95", "PASSPORT": "OUP31WOE2IE", "FIRSTNAME": "Dara", "LASTNAME": "Wilcox", "GENDER": "1", "BIRTHDAY": "1996-06-29", "NATIONALITY": "Singapore", "HIRED": "2011-05-18", "DEPT": "Flight Attendance", "POSITION": "Airhostess", "STATUS": "1", "REGION": "Canada"}, {"EMPID": "97", "PASSPORT": "SUF73DKV4QE", "FIRSTNAME": "Dante", "LASTNAME": "Hart", "GENDER": "0", "BIRTHDAY": "1999-12-21", "NATIONALITY": "Peru", "HIRED": "2016-02-22", "DEPT": "Pilot", "POSITION": "Pilot", "STATUS": "1", "REGION": "Europe"}] \ No newline at end of file diff --git a/resources/by_nationality/Australia.csv b/resources/by_nationality/Australia.csv new file mode 100644 index 0000000..daba0b7 --- /dev/null +++ b/resources/by_nationality/Australia.csv @@ -0,0 +1,3 @@ +EMPID,PASSPORT,FIRSTNAME,LASTNAME,GENDER,BIRTHDAY,NATIONALITY,HIRED,DEPT,POSITION,STATUS,REGION +61,KGM73NWG1JP,Desirae,Melton,1,1993-11-07,Australia,2013-04-12,Aircraft Maintenance,Airhostess,0,Europe +76,YWT45VVP7KK,Nathan,Floyd,0,1988-01-04,Australia,2008-10-09,Flight Planning,Steward,3,USA diff --git a/resources/by_nationality/Austria.csv b/resources/by_nationality/Austria.csv new file mode 100644 index 0000000..d988e30 --- /dev/null +++ b/resources/by_nationality/Austria.csv @@ -0,0 +1,6 @@ +EMPID,PASSPORT,FIRSTNAME,LASTNAME,GENDER,BIRTHDAY,NATIONALITY,HIRED,DEPT,POSITION,STATUS,REGION +4,CYB72WYU6UR,Winter,Blair,0,1993-02-14,Austria,2022-03-24,Pilot,Steward,4,Ocenia +40,JHJ72ODJ7RA,Gregory,Bryant,0,1968-09-14,Austria,2017-01-10,Flight Planning,Pilot,0,Middle East +47,CQW50GAD3DS,Martin,Payne,1,1961-05-12,Austria,2015-10-07,Pilot,Pilot,4,Ocenia +48,MKI89CUF6PR,Fuller,Alvarez,0,1988-01-06,Austria,2016-12-30,Flight Attendance,Pilot,4,APAC +100,WIN16ELU8GN,Orlando,Mayer,0,1961-01-11,Austria,2003-04-07,Pilot,Pilot,0,APAC diff --git a/resources/by_nationality/Belgium.csv b/resources/by_nationality/Belgium.csv new file mode 100644 index 0000000..e9c53ea --- /dev/null +++ b/resources/by_nationality/Belgium.csv @@ -0,0 +1,2 @@ +EMPID,PASSPORT,FIRSTNAME,LASTNAME,GENDER,BIRTHDAY,NATIONALITY,HIRED,DEPT,POSITION,STATUS,REGION +72,AUY27DLM5FK,Leilani,Moran,0,1996-08-25,Belgium,2005-04-08,Aircraft Maintenance,Airhostess,2,Ocenia diff --git a/resources/by_nationality/Brazil.csv b/resources/by_nationality/Brazil.csv new file mode 100644 index 0000000..78732fd --- /dev/null +++ b/resources/by_nationality/Brazil.csv @@ -0,0 +1,4 @@ +EMPID,PASSPORT,FIRSTNAME,LASTNAME,GENDER,BIRTHDAY,NATIONALITY,HIRED,DEPT,POSITION,STATUS,REGION +55,JJG71FLY1XR,Paula,Delaney,0,1986-09-18,Brazil,2003-01-29,Aircraft Maintenance,Steward,2,Middle East +68,GDJ74WSM7LG,Autumn,Page,0,1969-11-01,Brazil,2001-04-24,Aircraft Maintenance,Airhostess,3,Middle East +98,DOB31QXV4GZ,Moana,Walsh,1,1995-05-03,Brazil,2002-04-21,Pilot,Airhostess,3,Ocenia diff --git a/resources/by_nationality/China.csv b/resources/by_nationality/China.csv new file mode 100644 index 0000000..f641d81 --- /dev/null +++ b/resources/by_nationality/China.csv @@ -0,0 +1,3 @@ +EMPID,PASSPORT,FIRSTNAME,LASTNAME,GENDER,BIRTHDAY,NATIONALITY,HIRED,DEPT,POSITION,STATUS,REGION +31,JBK92QBQ9CF,Kyra,Noel,1,1972-08-25,China,2005-11-27,Flight Attendance,Airhostess,3,Canada +59,VDF94IVV1UX,Nomlanga,Stout,0,1975-04-03,China,2009-08-06,Flight Planning,Airhostess,0,Canada diff --git a/resources/by_nationality/Colombia.csv b/resources/by_nationality/Colombia.csv new file mode 100644 index 0000000..11378ee --- /dev/null +++ b/resources/by_nationality/Colombia.csv @@ -0,0 +1,3 @@ +EMPID,PASSPORT,FIRSTNAME,LASTNAME,GENDER,BIRTHDAY,NATIONALITY,HIRED,DEPT,POSITION,STATUS,REGION +22,SOM23XJR5NC,Igor,Ochoa,1,1972-10-11,Colombia,2005-11-02,Flight Planning,Airhostess,4,APAC +49,PRX53TYM5LT,Macon,Trevino,1,1997-10-01,Colombia,2019-12-17,Flight Planning,Steward,0,Ocenia diff --git a/resources/by_nationality/Costa Rica.csv b/resources/by_nationality/Costa Rica.csv new file mode 100644 index 0000000..e5e931d --- /dev/null +++ b/resources/by_nationality/Costa Rica.csv @@ -0,0 +1,6 @@ +EMPID,PASSPORT,FIRSTNAME,LASTNAME,GENDER,BIRTHDAY,NATIONALITY,HIRED,DEPT,POSITION,STATUS,REGION +15,MOJ66TSD0LH,Jade,Simmons,1,1961-03-04,Costa Rica,2000-12-24,Aircraft Maintenance,Steward,0,Canada +19,SYT22ZIA2ZU,Thaddeus,Martinez,1,1975-04-02,Costa Rica,2015-07-11,Flight Attendance,Steward,0,Middle East +42,QSP69GYO0YK,Rajah,Roach,0,1992-12-13,Costa Rica,2011-05-26,Flight Attendance,Pilot,0,Europe +44,VTF75CUM7PC,Rhea,Keith,0,2000-06-28,Costa Rica,2010-10-30,Flight Attendance,Airhostess,4,Canada +62,LYL50VBA1GL,Armando,Moody,1,1989-04-24,Costa Rica,2020-04-15,Flight Planning,Steward,3,USA diff --git a/resources/by_nationality/France.csv b/resources/by_nationality/France.csv new file mode 100644 index 0000000..443e2d2 --- /dev/null +++ b/resources/by_nationality/France.csv @@ -0,0 +1,2 @@ +EMPID,PASSPORT,FIRSTNAME,LASTNAME,GENDER,BIRTHDAY,NATIONALITY,HIRED,DEPT,POSITION,STATUS,REGION +93,UXL43IOW6OV,Honorato,Maxwell,1,1982-03-09,France,2017-02-04,Aircraft Maintenance,Airhostess,1,Europe diff --git a/resources/by_nationality/Germany.csv b/resources/by_nationality/Germany.csv new file mode 100644 index 0000000..b69c47e --- /dev/null +++ b/resources/by_nationality/Germany.csv @@ -0,0 +1,5 @@ +EMPID,PASSPORT,FIRSTNAME,LASTNAME,GENDER,BIRTHDAY,NATIONALITY,HIRED,DEPT,POSITION,STATUS,REGION +2,CDC87ETW8EQ,Burton,Gallegos,0,1960-09-22,Germany,2021-10-29,Aircraft Maintenance,Pilot,1,APAC +18,DFE84WHT0ED,Joelle,Boyle,0,1962-07-19,Germany,2013-03-28,Flight Planning,Airhostess,0,Ocenia +29,CMK62UAD3VK,Rowan,Leonard,1,1974-07-15,Germany,2004-03-27,Aircraft Maintenance,Pilot,1,Ocenia +69,OOR56TFJ3XV,Nehru,Vargas,1,1976-09-25,Germany,2007-08-27,Flight Attendance,Pilot,2,USA diff --git a/resources/by_nationality/India.csv b/resources/by_nationality/India.csv new file mode 100644 index 0000000..b62d91e --- /dev/null +++ b/resources/by_nationality/India.csv @@ -0,0 +1,4 @@ +EMPID,PASSPORT,FIRSTNAME,LASTNAME,GENDER,BIRTHDAY,NATIONALITY,HIRED,DEPT,POSITION,STATUS,REGION +20,JDS74VWV5XG,Lester,Edwards,1,1973-10-11,India,2000-09-03,Flight Planning,Airhostess,0,Canada +21,SMN51EPH5FE,Aline,Riley,0,1989-06-04,India,2001-04-05,Flight Attendance,Pilot,3,APAC +88,TRJ51LBJ6II,Shaeleigh,Roth,1,1986-02-04,India,2004-03-15,Aircraft Maintenance,Steward,4,Europe diff --git a/resources/by_nationality/Indonesia.csv b/resources/by_nationality/Indonesia.csv new file mode 100644 index 0000000..3fdb153 --- /dev/null +++ b/resources/by_nationality/Indonesia.csv @@ -0,0 +1,4 @@ +EMPID,PASSPORT,FIRSTNAME,LASTNAME,GENDER,BIRTHDAY,NATIONALITY,HIRED,DEPT,POSITION,STATUS,REGION +33,EWD45RJW5YK,Carter,Velasquez,0,1967-11-23,Indonesia,2005-02-27,Flight Planning,Pilot,1,APAC +84,KMS88HTI5IR,Chanda,Wynn,1,1993-07-10,Indonesia,2014-11-20,Flight Planning,Steward,2,USA +92,HET44XPQ0RR,Lucy,Finch,1,1975-02-21,Indonesia,2002-05-19,Pilot,Steward,4,Middle East diff --git a/resources/by_nationality/Ireland.csv b/resources/by_nationality/Ireland.csv new file mode 100644 index 0000000..64c3f30 --- /dev/null +++ b/resources/by_nationality/Ireland.csv @@ -0,0 +1,3 @@ +EMPID,PASSPORT,FIRSTNAME,LASTNAME,GENDER,BIRTHDAY,NATIONALITY,HIRED,DEPT,POSITION,STATUS,REGION +37,GWY17TOL2UG,Matthew,Vasquez,1,1995-03-17,Ireland,2007-07-01,Flight Planning,Steward,4,Ocenia +67,BVY21SKG6CE,Kitra,Green,0,1967-07-10,Ireland,2006-09-12,Flight Planning,Airhostess,0,Middle East diff --git a/resources/by_nationality/Italy.csv b/resources/by_nationality/Italy.csv new file mode 100644 index 0000000..9a68d7f --- /dev/null +++ b/resources/by_nationality/Italy.csv @@ -0,0 +1,5 @@ +EMPID,PASSPORT,FIRSTNAME,LASTNAME,GENDER,BIRTHDAY,NATIONALITY,HIRED,DEPT,POSITION,STATUS,REGION +34,BFS82MEY3CX,Selma,Bush,0,1972-03-26,Italy,2008-10-10,Flight Attendance,Airhostess,1,USA +52,THN13DDU7PZ,Kieran,Hancock,1,1976-07-01,Italy,2023-04-14,Flight Planning,Airhostess,0,USA +78,YHV05IUP6ER,Willa,Ferguson,0,1969-12-10,Italy,2017-07-08,Flight Planning,Steward,3,Ocenia +80,EUC74ENE9ZK,Ryan,Rush,0,1998-06-13,Italy,2019-07-31,Aircraft Maintenance,Pilot,1,Middle East diff --git a/resources/by_nationality/Mexico.csv b/resources/by_nationality/Mexico.csv new file mode 100644 index 0000000..c1b8eb1 --- /dev/null +++ b/resources/by_nationality/Mexico.csv @@ -0,0 +1,6 @@ +EMPID,PASSPORT,FIRSTNAME,LASTNAME,GENDER,BIRTHDAY,NATIONALITY,HIRED,DEPT,POSITION,STATUS,REGION +7,SBJ34IXU7TC,Madeson,Mcintosh,1,1997-11-03,Mexico,2007-08-22,Flight Attendance,Steward,0,Ocenia +41,ITS61SWZ4PW,Duncan,Morrison,1,1975-04-24,Mexico,2012-03-01,Flight Planning,Steward,0,Europe +50,MRC33GHJ2KW,Calvin,Roach,1,1999-04-16,Mexico,2011-03-18,Flight Attendance,Steward,1,Europe +63,UVV50TVB3TS,Maggy,Miles,0,1972-01-16,Mexico,2015-08-02,Flight Planning,Pilot,3,Ocenia +74,HJL93JJY5GH,September,Morin,1,1997-09-15,Mexico,2014-08-26,Aircraft Maintenance,Steward,4,APAC diff --git a/resources/by_nationality/Netherlands.csv b/resources/by_nationality/Netherlands.csv new file mode 100644 index 0000000..4635ca4 --- /dev/null +++ b/resources/by_nationality/Netherlands.csv @@ -0,0 +1,5 @@ +EMPID,PASSPORT,FIRSTNAME,LASTNAME,GENDER,BIRTHDAY,NATIONALITY,HIRED,DEPT,POSITION,STATUS,REGION +14,TAP82QBU5PN,Lunea,Sweet,1,1992-10-27,Netherlands,2004-03-15,Pilot,Airhostess,3,Middle East +23,NFH65BYM0VB,Armand,Horn,0,1987-05-24,Netherlands,2007-06-19,Aircraft Maintenance,Airhostess,1,Ocenia +32,KUO96QIG4VK,Stephen,Dickson,0,1962-05-02,Netherlands,2013-03-15,Aircraft Maintenance,Airhostess,4,APAC +71,FSQ47TYA9DJ,Pascale,Silva,0,1968-10-13,Netherlands,2007-09-27,Pilot,Steward,4,Canada diff --git a/resources/by_nationality/New Zealand.csv b/resources/by_nationality/New Zealand.csv new file mode 100644 index 0000000..bbe912c --- /dev/null +++ b/resources/by_nationality/New Zealand.csv @@ -0,0 +1,2 @@ +EMPID,PASSPORT,FIRSTNAME,LASTNAME,GENDER,BIRTHDAY,NATIONALITY,HIRED,DEPT,POSITION,STATUS,REGION +83,LJK19GHE1TM,Dalton,Roberson,0,1994-05-02,New Zealand,2012-06-21,Aircraft Maintenance,Airhostess,0,Europe diff --git a/resources/by_nationality/Nigeria.csv b/resources/by_nationality/Nigeria.csv new file mode 100644 index 0000000..d1b87f8 --- /dev/null +++ b/resources/by_nationality/Nigeria.csv @@ -0,0 +1,2 @@ +EMPID,PASSPORT,FIRSTNAME,LASTNAME,GENDER,BIRTHDAY,NATIONALITY,HIRED,DEPT,POSITION,STATUS,REGION +85,MUE55VMY6MX,Solomon,Booker,0,1961-03-28,Nigeria,2007-09-18,Aircraft Maintenance,Steward,3,APAC diff --git a/resources/by_nationality/Norway.csv b/resources/by_nationality/Norway.csv new file mode 100644 index 0000000..8fd5f58 --- /dev/null +++ b/resources/by_nationality/Norway.csv @@ -0,0 +1,3 @@ +EMPID,PASSPORT,FIRSTNAME,LASTNAME,GENDER,BIRTHDAY,NATIONALITY,HIRED,DEPT,POSITION,STATUS,REGION +6,KXU40SKR1YO,Simone,Mosley,0,1994-11-20,Norway,2023-03-10,Flight Planning,Steward,2,Canada +90,MCJ12FYX5KN,Maxine,Branch,1,1979-05-29,Norway,2018-10-17,Pilot,Steward,0,Europe diff --git a/resources/by_nationality/Pakistan.csv b/resources/by_nationality/Pakistan.csv new file mode 100644 index 0000000..861e544 --- /dev/null +++ b/resources/by_nationality/Pakistan.csv @@ -0,0 +1,5 @@ +EMPID,PASSPORT,FIRSTNAME,LASTNAME,GENDER,BIRTHDAY,NATIONALITY,HIRED,DEPT,POSITION,STATUS,REGION +3,JUI65YBK7AF,Jada,Bender,0,1963-05-28,Pakistan,2001-02-11,Pilot,Pilot,1,Canada +28,VSN53SUD8EA,Lana,Aguirre,1,1979-10-30,Pakistan,2020-09-16,Flight Attendance,Pilot,2,Middle East +30,WJE55UKG3YU,Clarke,Norman,1,1987-06-15,Pakistan,2022-01-13,Aircraft Maintenance,Steward,3,USA +99,OUB92IKA7AU,Jonah,Solomon,1,1985-05-25,Pakistan,2023-04-30,Flight Attendance,Pilot,3,Europe diff --git a/resources/by_nationality/Peru.csv b/resources/by_nationality/Peru.csv new file mode 100644 index 0000000..f190152 --- /dev/null +++ b/resources/by_nationality/Peru.csv @@ -0,0 +1,7 @@ +EMPID,PASSPORT,FIRSTNAME,LASTNAME,GENDER,BIRTHDAY,NATIONALITY,HIRED,DEPT,POSITION,STATUS,REGION +36,TLM36YPP3NE,Vera,Ashley,1,1982-06-02,Peru,2022-03-12,Flight Attendance,Pilot,3,Canada +43,JWF56EYP2AN,Sophia,Fuller,1,1986-01-03,Peru,2012-02-15,Pilot,Steward,0,Europe +58,TZT98UWC8BW,Donna,Clay,1,1977-12-25,Peru,2003-05-16,Aircraft Maintenance,Steward,4,APAC +82,ISX87UNW0AD,Herrod,Oliver,0,1965-01-07,Peru,2023-01-16,Flight Attendance,Airhostess,0,Europe +87,RVO63HMC4NL,Ferris,Gilbert,0,1969-07-24,Peru,2002-12-25,Flight Planning,Steward,4,Europe +97,SUF73DKV4QE,Dante,Hart,0,1999-12-21,Peru,2016-02-22,Pilot,Pilot,1,Europe diff --git a/resources/by_nationality/Philippines.csv b/resources/by_nationality/Philippines.csv new file mode 100644 index 0000000..48011c3 --- /dev/null +++ b/resources/by_nationality/Philippines.csv @@ -0,0 +1,6 @@ +EMPID,PASSPORT,FIRSTNAME,LASTNAME,GENDER,BIRTHDAY,NATIONALITY,HIRED,DEPT,POSITION,STATUS,REGION +10,YHF52IXT9VG,Lamar,Reeves,1,1988-09-13,Philippines,2003-09-26,Flight Attendance,Pilot,2,Canada +25,BJQ37WBQ4UL,Leandra,Mayer,0,1974-09-07,Philippines,2019-09-17,Pilot,Steward,0,Europe +45,MIF51GHC3PF,Walker,Jarvis,0,1988-06-26,Philippines,2004-04-22,Aircraft Maintenance,Pilot,3,Ocenia +65,UCZ18XLY9OA,Solomon,Estes,0,1968-07-16,Philippines,2014-02-08,Aircraft Maintenance,Airhostess,0,USA +66,WKV12UQC6QF,Zachery,Valentine,0,1971-06-04,Philippines,2011-08-25,Flight Attendance,Steward,1,Middle East diff --git a/resources/by_nationality/Russian Federation.csv b/resources/by_nationality/Russian Federation.csv new file mode 100644 index 0000000..d1de78f --- /dev/null +++ b/resources/by_nationality/Russian Federation.csv @@ -0,0 +1,4 @@ +EMPID,PASSPORT,FIRSTNAME,LASTNAME,GENDER,BIRTHDAY,NATIONALITY,HIRED,DEPT,POSITION,STATUS,REGION +26,CCE27MGJ8KI,Chloe,Blanchard,1,1998-12-29,Russian Federation,2001-05-20,Pilot,Steward,2,Middle East +81,DCD61JXD7UO,Brady,Hernandez,1,1961-11-26,Russian Federation,2022-09-01,Pilot,Airhostess,2,Europe +96,LJB26BQM6PS,Laith,Whitfield,0,1987-01-14,Russian Federation,2001-02-09,Pilot,Airhostess,0,APAC diff --git a/resources/by_nationality/Singapore.csv b/resources/by_nationality/Singapore.csv new file mode 100644 index 0000000..dce68ef --- /dev/null +++ b/resources/by_nationality/Singapore.csv @@ -0,0 +1,4 @@ +EMPID,PASSPORT,FIRSTNAME,LASTNAME,GENDER,BIRTHDAY,NATIONALITY,HIRED,DEPT,POSITION,STATUS,REGION +70,RAX87DEX6CC,Ferris,Houston,0,1981-05-01,Singapore,2016-02-23,Pilot,Pilot,3,Canada +86,WND47SBT6OF,Yardley,Buckley,1,1989-06-24,Singapore,2002-06-04,Flight Attendance,Pilot,3,USA +95,OUP31WOE2IE,Dara,Wilcox,1,1996-06-29,Singapore,2011-05-18,Flight Attendance,Airhostess,1,Canada diff --git a/resources/by_nationality/South Africa.csv b/resources/by_nationality/South Africa.csv new file mode 100644 index 0000000..3401b80 --- /dev/null +++ b/resources/by_nationality/South Africa.csv @@ -0,0 +1,4 @@ +EMPID,PASSPORT,FIRSTNAME,LASTNAME,GENDER,BIRTHDAY,NATIONALITY,HIRED,DEPT,POSITION,STATUS,REGION +24,EQI56KFP6NU,Chaney,Ramsey,1,1972-06-13,South Africa,2002-12-19,Aircraft Maintenance,Steward,2,USA +51,BPO49TXH0XX,Charles,Kim,0,1968-12-30,South Africa,2015-09-12,Flight Planning,Pilot,2,Ocenia +75,KVI04NMS2QH,Shay,Mcdonald,1,1999-12-29,South Africa,2007-03-07,Aircraft Maintenance,Airhostess,4,Ocenia diff --git a/resources/by_nationality/South Korea.csv b/resources/by_nationality/South Korea.csv new file mode 100644 index 0000000..5d6edc9 --- /dev/null +++ b/resources/by_nationality/South Korea.csv @@ -0,0 +1,3 @@ +EMPID,PASSPORT,FIRSTNAME,LASTNAME,GENDER,BIRTHDAY,NATIONALITY,HIRED,DEPT,POSITION,STATUS,REGION +1,OQI75XIE4UX,Christopher,Kennedy,1,1978-02-05,South Korea,2005-02-20,Flight Planning,Steward,2,Europe +35,XPI62OGX6QX,Roary,Frank,1,1979-12-30,South Korea,2008-11-12,Flight Attendance,Airhostess,2,Middle East diff --git a/resources/by_nationality/Spain.csv b/resources/by_nationality/Spain.csv new file mode 100644 index 0000000..8c731f3 --- /dev/null +++ b/resources/by_nationality/Spain.csv @@ -0,0 +1,2 @@ +EMPID,PASSPORT,FIRSTNAME,LASTNAME,GENDER,BIRTHDAY,NATIONALITY,HIRED,DEPT,POSITION,STATUS,REGION +57,GRE66NCT2EF,Aimee,Stone,0,1990-09-08,Spain,2007-07-25,Flight Attendance,Pilot,3,Middle East diff --git a/resources/by_nationality/Sweden.csv b/resources/by_nationality/Sweden.csv new file mode 100644 index 0000000..31d2d21 --- /dev/null +++ b/resources/by_nationality/Sweden.csv @@ -0,0 +1,6 @@ +EMPID,PASSPORT,FIRSTNAME,LASTNAME,GENDER,BIRTHDAY,NATIONALITY,HIRED,DEPT,POSITION,STATUS,REGION +9,WOW94MLI6CM,Prescott,Dudley,0,1990-04-07,Sweden,2012-11-16,Pilot,Steward,2,Canada +12,KGM77GAL2UW,Levi,Atkinson,0,1969-10-08,Sweden,2002-09-13,Aircraft Maintenance,Steward,4,Europe +13,UOM66JXI0ZD,Levi,Myers,0,1998-12-29,Sweden,2004-09-13,Aircraft Maintenance,Steward,0,Europe +16,WRS57BWI1RG,Serina,Tran,1,1980-11-28,Sweden,2010-07-18,Flight Planning,Steward,2,Canada +91,WEA16MFX7OE,Drew,Gordon,0,1981-10-31,Sweden,2015-04-19,Aircraft Maintenance,Steward,2,Ocenia diff --git a/resources/by_nationality/Turkey.csv b/resources/by_nationality/Turkey.csv new file mode 100644 index 0000000..d32c11a --- /dev/null +++ b/resources/by_nationality/Turkey.csv @@ -0,0 +1,4 @@ +EMPID,PASSPORT,FIRSTNAME,LASTNAME,GENDER,BIRTHDAY,NATIONALITY,HIRED,DEPT,POSITION,STATUS,REGION +39,DDI37UIV8QD,Trevor,Wyatt,0,1998-02-14,Turkey,2010-03-15,Pilot,Airhostess,2,USA +46,ZGJ51FDM2LC,Reese,Christensen,0,1993-09-15,Turkey,2011-08-10,Aircraft Maintenance,Pilot,3,Ocenia +64,GSW02GPL6OY,Wyoming,Joyner,0,1991-11-20,Turkey,2022-04-17,Flight Attendance,Steward,0,Europe diff --git a/resources/by_nationality/Ukraine.csv b/resources/by_nationality/Ukraine.csv new file mode 100644 index 0000000..832d100 --- /dev/null +++ b/resources/by_nationality/Ukraine.csv @@ -0,0 +1,3 @@ +EMPID,PASSPORT,FIRSTNAME,LASTNAME,GENDER,BIRTHDAY,NATIONALITY,HIRED,DEPT,POSITION,STATUS,REGION +5,AZE20CSG4MU,Lillian,Reese,0,1982-12-03,Ukraine,2002-05-19,Flight Planning,Steward,1,Canada +94,BVQ96KDP3EL,Darryl,Nichols,1,1988-05-29,Ukraine,2001-02-19,Aircraft Maintenance,Steward,0,USA diff --git a/resources/by_nationality/United Kingdom.csv b/resources/by_nationality/United Kingdom.csv new file mode 100644 index 0000000..9e9bf96 --- /dev/null +++ b/resources/by_nationality/United Kingdom.csv @@ -0,0 +1,4 @@ +EMPID,PASSPORT,FIRSTNAME,LASTNAME,GENDER,BIRTHDAY,NATIONALITY,HIRED,DEPT,POSITION,STATUS,REGION +27,EDF66USR7HP,Anjolie,Dudley,1,1975-12-27,United Kingdom,2004-07-28,Aircraft Maintenance,Steward,0,USA +53,EKI78MBL1DM,Irene,Moon,0,1973-10-02,United Kingdom,2015-04-21,Flight Attendance,Airhostess,2,USA +54,ZCM30CQE2UN,Noelani,Watkins,0,1969-08-31,United Kingdom,2016-07-18,Aircraft Maintenance,Airhostess,4,Europe diff --git a/resources/by_nationality/United States.csv b/resources/by_nationality/United States.csv new file mode 100644 index 0000000..ecff0bb --- /dev/null +++ b/resources/by_nationality/United States.csv @@ -0,0 +1,5 @@ +EMPID,PASSPORT,FIRSTNAME,LASTNAME,GENDER,BIRTHDAY,NATIONALITY,HIRED,DEPT,POSITION,STATUS,REGION +8,UCT91SOT6EN,Josephine,Hansen,1,1982-10-12,United States,2021-12-24,Flight Planning,Pilot,4,Middle East +17,TZU74JZT1GC,Talon,Santiago,1,1969-04-17,United States,2015-09-02,Aircraft Maintenance,Steward,0,Canada +73,XIJ68PKR7QT,Darius,Serrano,0,1990-04-29,United States,2005-11-03,Pilot,Steward,4,Middle East +79,RCQ71JXX4NH,Teagan,Daniel,1,1983-09-02,United States,2005-05-22,Pilot,Steward,0,APAC diff --git a/resources/by_nationality/Vietnam.csv b/resources/by_nationality/Vietnam.csv new file mode 100644 index 0000000..eaf996d --- /dev/null +++ b/resources/by_nationality/Vietnam.csv @@ -0,0 +1,7 @@ +EMPID,PASSPORT,FIRSTNAME,LASTNAME,GENDER,BIRTHDAY,NATIONALITY,HIRED,DEPT,POSITION,STATUS,REGION +11,LBI65YUK1BG,Hamilton,Duffy,1,1987-11-09,Vietnam,2021-12-31,Aircraft Maintenance,Steward,4,APAC +38,KMG07QVW7MP,Kylynn,Mullins,0,1979-04-19,Vietnam,2020-11-07,Aircraft Maintenance,Steward,0,Middle East +56,UWS82URG4LM,Keelie,Crosby,0,1985-07-17,Vietnam,2002-04-01,Flight Planning,Steward,0,USA +60,IUE46AKB9OH,Yuri,Evans,1,1973-10-05,Vietnam,2022-04-18,Aircraft Maintenance,Airhostess,0,Ocenia +77,EOP89YXA3YW,Wayne,Bowman,0,1991-03-02,Vietnam,2007-03-28,Aircraft Maintenance,Steward,2,APAC +89,PHE40UOS0GY,Amanda,Schwartz,1,1983-04-03,Vietnam,2019-08-06,Aircraft Maintenance,Steward,4,APAC diff --git a/src/convert_xml_to_csv.py b/src/convert_xml_to_csv.py index b6c4a70..7f8039b 100644 --- a/src/convert_xml_to_csv.py +++ b/src/convert_xml_to_csv.py @@ -46,10 +46,15 @@ def read_xml_to_list_of_dict(path: str) -> tuple[List[dict], List[dict]]: row[elem.tag] = elem.text if check_hired_greater_than_3year(row["HIRED"]) \ and row["POSITION"] in ["Airhostess", "Pilot", "Steward"] \ - and row["STATUS"] == "1": + and row["STATUS"] == "1" \ + and row["GENDER"] in ["0", "1"]: dev_club.append(row) - else: - dev_mountain.append(row) + continue + + if row["STATUS"] not in ["1", "2", "3"] and row["GENDER"] not in ["0", "1"]: + continue + + dev_mountain.append(row) return dev_mountain, dev_club diff --git a/src/generate_csv_by_nationality.py b/src/generate_csv_by_nationality.py index 4121176..e2f88e9 100644 --- a/src/generate_csv_by_nationality.py +++ b/src/generate_csv_by_nationality.py @@ -21,6 +21,10 @@ def read_xml_to_list_of_dict(path: str) -> List[dict]: continue row[elem.tag] = elem.text + + if row["STATUS"] not in ["1", "2", "3"] and row["GENDER"] not in ["0", "1"]: + continue + data.append(row) return data From 2f0867d0c401d0fd5dfe4ffd8276b9781de2c753 Mon Sep 17 00:00:00 2001 From: kongphop Date: Sun, 9 Oct 2022 14:40:38 +0700 Subject: [PATCH 15/16] clean code --- src/generate_json.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/generate_json.py b/src/generate_json.py index 90b9a6b..2a230e3 100644 --- a/src/generate_json.py +++ b/src/generate_json.py @@ -4,10 +4,10 @@ def generate_json(path: str, json_file_name: str): - with open(path) as f: - data = [{k: v for k, v in row.items()} for row in csv.DictReader(f, skipinitialspace=True)] - with open(json_file_name, "w") as f: - json.dump(data, f) + with open(path) as csv_file: + data = [{key: val for key, val in row.items()} for row in csv.DictReader(csv_file, skipinitialspace=True)] + with open(json_file_name, "w") as json_file: + json.dump(data, json_file) if __name__ == "__main__": From b2c64bf6e52bbd42b010a7e0ac7084690a27e4d7 Mon Sep 17 00:00:00 2001 From: pynsuphasueb Date: Sun, 9 Oct 2022 15:54:06 +0700 Subject: [PATCH 16/16] add visualize data dev club --- visualize_dev_club.ipynb | 490 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 490 insertions(+) create mode 100644 visualize_dev_club.ipynb diff --git a/visualize_dev_club.ipynb b/visualize_dev_club.ipynb new file mode 100644 index 0000000..eb7c16f --- /dev/null +++ b/visualize_dev_club.ipynb @@ -0,0 +1,490 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "from datetime import datetime\n", + "from time import strptime" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "df = pd.read_csv(\"/Users/isky/Documents/GitHub/hackathon-season2/playground/dev_club.csv\")" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "df.columns = df.columns.str.lower()\n", + "df['position'] = df['position'].str.lower()\n", + "df['dept'] = df['dept'].str.lower()\n", + "df['gender'] = df['gender'].replace(0, 'male').replace(1, \"female\")\n", + "df['hired_year'] = df['hired'].map(lambda x: datetime.strptime(x,'%Y-%m-%d').year)\n", + "df['hired_dt'] = df['hired'].map(lambda x: datetime.strptime(x,'%Y-%m-%d'))" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
      \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      empidpassportfirstnamelastnamegenderbirthdaynationalityhireddeptpositionstatusregionagehired_agehired_yearhired_dt
      03JUI65YBK7AFJadaBendermale1963-05-28Pakistan2001-02-11pilotpilot1Canada592120012001-02-11
      15AZE20CSG4MULillianReesemale1982-12-03Ukraine2002-05-19flight planningsteward1Canada392020022002-05-19
      223NFH65BYM0VBArmandHornmale1987-05-24Netherlands2007-06-19aircraft maintenanceairhostess1Ocenia351520072007-06-19
      329CMK62UAD3VKRowanLeonardfemale1974-07-15Germany2004-03-27aircraft maintenancepilot1Ocenia481820042004-03-27
      433EWD45RJW5YKCarterVelasquezmale1967-11-23Indonesia2005-02-27flight planningpilot1APAC541720052005-02-27
      534BFS82MEY3CXSelmaBushmale1972-03-26Italy2008-10-10flight attendanceairhostess1USA501320082008-10-10
      650MRC33GHJ2KWCalvinRoachfemale1999-04-16Mexico2011-03-18flight attendancesteward1Europe231120112011-03-18
      766WKV12UQC6QFZacheryValentinemale1971-06-04Philippines2011-08-25flight attendancesteward1Middle East511120112011-08-25
      880EUC74ENE9ZKRyanRushmale1998-06-13Italy2019-07-31aircraft maintenancepilot1Middle East24320192019-07-31
      993UXL43IOW6OVHonoratoMaxwellfemale1982-03-09France2017-02-04aircraft maintenanceairhostess1Europe40520172017-02-04
      1095OUP31WOE2IEDaraWilcoxfemale1996-06-29Singapore2011-05-18flight attendanceairhostess1Canada261120112011-05-18
      1197SUF73DKV4QEDanteHartmale1999-12-21Peru2016-02-22pilotpilot1Europe22620162016-02-22
      \n", + "
      " + ], + "text/plain": [ + " empid passport firstname lastname gender birthday nationality \\\n", + "0 3 JUI65YBK7AF Jada Bender male 1963-05-28 Pakistan \n", + "1 5 AZE20CSG4MU Lillian Reese male 1982-12-03 Ukraine \n", + "2 23 NFH65BYM0VB Armand Horn male 1987-05-24 Netherlands \n", + "3 29 CMK62UAD3VK Rowan Leonard female 1974-07-15 Germany \n", + "4 33 EWD45RJW5YK Carter Velasquez male 1967-11-23 Indonesia \n", + "5 34 BFS82MEY3CX Selma Bush male 1972-03-26 Italy \n", + "6 50 MRC33GHJ2KW Calvin Roach female 1999-04-16 Mexico \n", + "7 66 WKV12UQC6QF Zachery Valentine male 1971-06-04 Philippines \n", + "8 80 EUC74ENE9ZK Ryan Rush male 1998-06-13 Italy \n", + "9 93 UXL43IOW6OV Honorato Maxwell female 1982-03-09 France \n", + "10 95 OUP31WOE2IE Dara Wilcox female 1996-06-29 Singapore \n", + "11 97 SUF73DKV4QE Dante Hart male 1999-12-21 Peru \n", + "\n", + " hired dept position status region age \\\n", + "0 2001-02-11 pilot pilot 1 Canada 59 \n", + "1 2002-05-19 flight planning steward 1 Canada 39 \n", + "2 2007-06-19 aircraft maintenance airhostess 1 Ocenia 35 \n", + "3 2004-03-27 aircraft maintenance pilot 1 Ocenia 48 \n", + "4 2005-02-27 flight planning pilot 1 APAC 54 \n", + "5 2008-10-10 flight attendance airhostess 1 USA 50 \n", + "6 2011-03-18 flight attendance steward 1 Europe 23 \n", + "7 2011-08-25 flight attendance steward 1 Middle East 51 \n", + "8 2019-07-31 aircraft maintenance pilot 1 Middle East 24 \n", + "9 2017-02-04 aircraft maintenance airhostess 1 Europe 40 \n", + "10 2011-05-18 flight attendance airhostess 1 Canada 26 \n", + "11 2016-02-22 pilot pilot 1 Europe 22 \n", + "\n", + " hired_age hired_year hired_dt \n", + "0 21 2001 2001-02-11 \n", + "1 20 2002 2002-05-19 \n", + "2 15 2007 2007-06-19 \n", + "3 18 2004 2004-03-27 \n", + "4 17 2005 2005-02-27 \n", + "5 13 2008 2008-10-10 \n", + "6 11 2011 2011-03-18 \n", + "7 11 2011 2011-08-25 \n", + "8 3 2019 2019-07-31 \n", + "9 5 2017 2017-02-04 \n", + "10 11 2011 2011-05-18 \n", + "11 6 2016 2016-02-22 " + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "def calculate_year(str_date):\n", + " date = datetime.strptime(str_date,'%Y-%m-%d')\n", + " today = datetime.today()\n", + " return today.year - date.year - ((today.month, today.day) < (date.month, date.day))" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "df['age'] = df['birthday'].map(calculate_year)\n", + "df['hired_age'] = df['hired'].map(calculate_year)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
      " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "df.groupby(['gender']).sum().plot(\n", + "\tkind='pie', y='status', autopct='%1.0f%%')\n" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "df_sum_hired_year = df.groupby(['hired_year'])['hired_year'].count().reset_index(name=\"count\")" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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tuwdgJw1jueff14MGjRI+Pj4iJCQEDFp0iTx1Vdfudw4hGj+F6avr69488037dZ/tcby2muviUsuuUT4+vqK6Ohocc8994gTJ05oahyd/Szn5eUpbQYMGNBhG1cbx8mTJ8Vtt90m+vTpIyIjI8Xs2bNFWVmZy42jqalJxMbGiieffNIufVdjHKWlpeLKK68U/v7+ws/PT9xwww1i3759dhkDT4MnIiIij8MiaCIiIvI4DEBERETkcRiAiIiIyOMwABEREZHHYQAiIiIij8MARERERB6HAYiIiIg8DgMQEREReRwGICJyuEmTJmHRokWdvi5JEjZt2mT3783Pz4ckScjOzrb7ZxORazOo3QEioqKiIgQHB6vdDSLyIJwBIiLVRUVFwWg0dvp6Q0ODE3vjXPX19Wp3gcgjMQARkVNYrVY89thjCAkJQVRUFJ555hnltba3wOTbVh988AGuvfZa+Pj4YN26dQCAt99+GxdffDF8fHwwbNgwvP766zbf8d133+HSSy+Fj48PLr/8cmRlZXWpb0IIDB48GMuXL7e5np2dDUmScOzYMQBARUUF5s6di/DwcAQGBuL666/HDz/8oLTPycnBtGnTEBkZiT59+mDcuHH473//a/OZAwcOxLPPPouZM2ciMDAQDzzwQJf6SET2xQBERE7xzjvvwN/fH/v378cLL7yAv/71r9i+fXun7Z944gksXLgQv/zyC5KTk7Fu3TosWbIEf/vb3/DLL7/g73//O55++mm88847AIDq6mr87ne/wyWXXIKDBw/imWeewSOPPNKlvkmShPvvvx9r1661ub527VpMnDgRgwcPBgDccccdOH36NL744gscPHgQl112GW644QacPXtW6cPNN9+MHTt2ICsrC5MnT8bUqVNRUFBg87nLly/H6NGjkZWVhaeffrrLv4ZEZEd2OVOeiOg8rr32WnH11VfbXBs3bpx4/PHHhRBCABAbN24UQgiRl5cnAIhXXnnFpv2gQYPE+vXrba49++yzIjExUQghxBtvvCFCQ0NFbW2t8vrKlSsFAJGVlXXBPp48eVLo9Xqxf/9+IYQQ9fX1IiwsTGRkZAghhPj6669FYGCgqKura9evN954o9PPHT58uPjXv/6lPB8wYIBISUm5YH+IyLFYBE1ETjFq1Cib59HR0Th9+nSn7S+//HLlv81mM3JycjBnzhzMmzdPud7Y2IigoCAAwC+//IJRo0bBx8dHeT0xMbHL/YuJicEtt9yCNWvW4IorrsBnn30Gi8WCO+64AwDwww8/oLq6GqGhoTbvq62tRU5ODoDmGaBnnnkGn3/+OYqKitDY2Ija2tp2M0Btx0ZE6mAAIiKn8PLysnkuSRKsVmun7f39/ZX/rq6uBgC89dZbGD9+vE07vV5vtz7OnTsX9957L15++WWsXbsW06dPh5+fn9KH6OhoZGZmtntf3759AQCPPPIItm/fjuXLl2Pw4MHw9fXF7bff3q7Que3YiEgdDEBEpHmRkZGIiYlBbm4u7rnnng7bXHzxxfj3v/+Nuro6ZRZo37593fqem2++Gf7+/li5ciW2bt2K3bt3K69ddtllKC4uhsFgwMCBAzt8/zfffIPZs2fj1ltvBdAcmvLz87vVByJyDhZBE5FLWLZsGdLT0/Haa6/ht99+w6FDh7B27Vq89NJLAIC7774bkiRh3rx5+Pnnn7Fly5Z2q7ouRK/XY/bs2UhLS8NFF11kcwstKSkJiYmJSElJwZdffon8/Hx8++23+Mtf/oIDBw4AAC666CJ88sknyM7Oxg8//IC77777vLNcRKQeBiAicglz587F22+/jbVr12LkyJG49tprkZGRgfj4eABAnz598Nlnn+HQoUO49NJL8Ze//AXPP/98t79nzpw5qK+vx3333WdzXZIkbNmyBRMnTsR9992HIUOG4K677sLx48cRGRkJAHjppZcQHByMCRMmYOrUqUhOTsZll13W+8ETkd1JQgihdieIiLTi66+/xg033IDCwkIl2BCR+2EAIiICYLFYUFpailmzZiEqKkrZfJGI3BNvgRGRR3jwwQfRp0+fDh8PPvgg3n//fQwYMAAVFRV44YUX1O4uETkYZ4CIyCOcPn0aJpOpw9cCAwMRERHh5B4RkZoYgIiIiMjj8BYYEREReRwGICIiIvI4DEBERETkcRiAiIiIyOMwABEREZHHYQAiIiIij8MARERERB6HAYiIiIg8zv8PC51etgoDUPcAAAAASUVORK5CYII=", + "text/plain": [ + "
      " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(df_sum_hired_year['hired_year'].astype(str),df_sum_hired_year['count'])\n", + "plt.xlabel('hired_year')\n", + "plt.ylabel('count')\n", + "plt.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.10.6 64-bit", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.6" + }, + "orig_nbformat": 4, + "vscode": { + "interpreter": { + "hash": "b0fa6594d8f4cbf19f97940f81e996739fb7646882a419484c72d19e05852a7e" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}