From 1204b86e7c1245fa76b9ed24ff6ccfc3d98e2731 Mon Sep 17 00:00:00 2001 From: Muhammad Tayayb Tahir Qureshi Date: Tue, 11 Jun 2024 13:57:32 +0500 Subject: [PATCH 01/29] Implemented parser to parse files and save weather readings --- .DS_Store | Bin 0 -> 6148 bytes .gitignore | 6 +++-- weatherfiles.zip | Bin 0 -> 142616 bytes weatherman.py | 62 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 66 insertions(+), 2 deletions(-) create mode 100644 .DS_Store create mode 100644 weatherfiles.zip create mode 100644 weatherman.py diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..b3422834e674e9a8975227dfe6324bc3b39db509 GIT binary patch literal 6148 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 vRDGb~IY={&gVa;=a8$6rLhIMRw42e Date: Tue, 11 Jun 2024 14:28:34 +0500 Subject: [PATCH 02/29] UPDATE --- weatherman.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/weatherman.py b/weatherman.py index 3d218b4..5d75328 100644 --- a/weatherman.py +++ b/weatherman.py @@ -5,8 +5,7 @@ def extract_files(path): - """ - Extracts files from a weatherfiles archive. + """Extracts files from a weatherfiles archive. Args: path (str): The path to the directory where the extracted files will be placed. From e0bd13b2fb01d21f209ba8b9b97fd30c92cca7da Mon Sep 17 00:00:00 2001 From: Muhammad Tayayb Tahir Qureshi Date: Tue, 11 Jun 2024 20:49:04 +0500 Subject: [PATCH 03/29] weather report for a particular year --- .DS_Store | Bin 6148 -> 8196 bytes weatherman.py | 134 ++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 130 insertions(+), 4 deletions(-) diff --git a/.DS_Store b/.DS_Store index b3422834e674e9a8975227dfe6324bc3b39db509..63c701de5065285f388304b5f82c6fbf7f26e71f 100644 GIT binary patch delta 604 zcmZoMXmOBWU|?W$DortDU;r^WfEYvza8FDWo2aMA$iFdQH}hr%jz7$c**Q2S7O*h# zZ{}fXVB#>bG|^EoF*lwp#cDtKGpl5MW^!3UQcivn(7Z!Q1v#0;B?bof1q2wGm|0la z*f}`4xOsT__yq)ogat(eMMXu$#6^W9rKIBpgp(4Jv(t<6OY>5k^KfwfjR2BdgiJ&QRFG@|#i%u`f zOz}@kD^4wmKw?LNtV=G+&&dhMFU~B<%+HIA0b5^^n(LXDmJhTNQot#3G@fZ?O;2D3lftv^U{^=KL7(7 z2so7;G$1Si24x5X7!e{c7L;b>49UySOI3CVfCwl%ctd447_=E283KbDVi*b;8W^TC zEM{2GaFF2~!()c8jLeL@jAD#RjM|JkjHZm{j1G*Bj6saSj1i295baEiP-A4EG?Ze@ z+I)e{oN;4;7?U6~L`;GkNV|d($7Vr}@640=MLZ|_^KftgO#r1EhRN|fQzr|vf7w_d G%me@)8J7(J delta 113 zcmZp1XfcprU|?W$DortDU=RQ@Ie-{Mvv5sJ6q~50$jG-bU^g=(-)0_x2ByhEg6@+) z3rcRjCL+zan4N<|kQt~H2n4u+geyqb#>DT;llf&lL1r*8LCgbL!LT`=XAUy}W{MKd diff --git a/weatherman.py b/weatherman.py index 5d75328..4b96621 100644 --- a/weatherman.py +++ b/weatherman.py @@ -3,6 +3,21 @@ import os import pandas as pd +MONTHS = { + 1: "Jan", + 2: "Feb", + 3: "Mar", + 4: "Apr", + 5: "May", + 6: "Jun", + 7: "Jul", + 8: "Aug", + 9: "Sep", + 10: "Oct", + 11: "Nov", + 12: "Dec", +} + def extract_files(path): """Extracts files from a weatherfiles archive. @@ -28,15 +43,15 @@ def parse(path): subdirectory. Returns: - weather_readings (dict): A dictionary where keys are constructed from - year and month information in the filenames, and values are pandas - DataFrames containing the parsed weather data. + weather_readings (dict): A dictionary where readings are stored as + pandas dataframes. """ weather_readings = {} dir_path = os.path.join(path, "weatherfiles") for filename in os.listdir(dir_path): file_path = os.path.join(dir_path, filename) + # making the key to be of the format: '2006_Apr' key = filename.split("_")[2:] key[-1] = key[-1].split(".")[0] key = "_".join(key) @@ -46,6 +61,99 @@ def parse(path): return weather_readings +def stats_extremes(weather_readings, year): + """Calculates weather extremes for a specific year. + + Args: + weather_readings (dict): A dictionary where readings are stored as + pandas dataframes. + year (int): The year for which to calculate weather extremes. + + Returns: + dict: A dictionary containing the following keys: + - 'max_temperature': The maximum temperature. + - 'min_temperature': The minimum temperature. + - 'max_humidity': The maximum humidity percentage. + - 'date_max_temp': The date (PKT format) with the maximum temperature. + - 'date_min_temp': The date (PKT format) with the minimum temperature. + - 'date_max_humid': The date (PKT format) with the maximum humidity. + """ + max_temperature = -100 + min_temperature = 100 + max_humidity = 0 + date_max_temp = "" + date_min_temp = "" + date_max_humid = "" + + for key in weather_readings.keys(): + if key.startswith(str(year)): + df = weather_readings[key] + + max_temp_index = df["Max TemperatureC"].idxmax() + max_temp_row = df.loc[max_temp_index] + temperature = max_temp_row["Max TemperatureC"] + if temperature > max_temperature: + max_temperature = temperature + date_max_temp = max_temp_row["PKT"] + + min_temp_index = df["Min TemperatureC"].idxmin() + min_temp_row = df.loc[min_temp_index] + temperature = min_temp_row["Min TemperatureC"] + if temperature < min_temperature: + min_temperature = temperature + date_min_temp = min_temp_row["PKT"] + + max_humid_index = df["Max Humidity"].idxmax() + max_humid_row = df.loc[max_humid_index] + humidity = max_humid_row["Max Humidity"] + if humidity > max_humidity: + max_humidity = humidity + date_max_humid = max_humid_row["PKT"] + + results = { + "max_temperature": max_temperature, + "min_temperature": min_temperature, + "max_humidity": max_humidity, + "date_max_temp": date_max_temp, + "date_min_temp": date_min_temp, + "date_max_humid": date_max_humid, + } + return results + + +def generate_report_extremes(weather_readings, year): + """Generates a report summarizing weather extremes for a year. + + This function takes the results of `stats_extremes` for a given year and + formats them into a well-defined report. + + Args: + weather_readings (dict): A dictionary where readings are stored as + pandas dataframes. + year (int): The year for which the report is generated. + + Returns: + None + """ + extremes = stats_extremes(weather_readings, year) + date_max_temp = extremes["date_max_temp"].split("-") + date_min_temp = extremes["date_min_temp"].split("-") + date_humidity = extremes["date_max_humid"].split("-") + + print( + f"""Highest: {extremes["max_temperature"]}C on {MONTHS[int(date_max_temp[1])]} {date_max_temp[2]}\nLowest: {extremes["min_temperature"]}C on {MONTHS[int(date_min_temp[1])]} {date_min_temp[2]}\nHumidity: {extremes["max_humidity"]}% on {MONTHS[int(date_humidity[1])]} {date_humidity[2]} + """ + ) + + +def stats_averages(weather_readings, year, month): + pass + + +def stats_chart(weather_readings, year, month): + pass + + if __name__ == "__main__": parser = argparse.ArgumentParser() @@ -58,4 +166,22 @@ def parse(path): extract_files(args.extract_path) weather_readings = parse(args.extract_path) - print(weather_readings["2006_Apr"].head()) + # print(weather_readings["2006_Apr"].head()) + # cols = weather_readings["2006_Apr"].columns + # print(cols) + + if args.extremes is not None: + year = int(args.extremes) + generate_report_extremes(weather_readings, year) + + if args.averages is not None: + inp = args.averages.split("/") + year = int(inp[0]) + month = int(inp[1]) + stats_averages(weather_readings, year, month) + + if args.chart is not None: + inp = args.averages.split("/") + year = int(inp[0]) + month = int(inp[1]) + stats_chart(weather_readings, year, month) From 30130f17b317ca21d7e8b7f1faeb6e94b82e0fb3 Mon Sep 17 00:00:00 2001 From: Muhammad Tayayb Tahir Qureshi Date: Wed, 12 Jun 2024 11:37:23 +0500 Subject: [PATCH 04/29] weather report generation, given a month --- .DS_Store | Bin 8196 -> 8196 bytes weatherman.py | 160 ++++++++++++++++++++++++++++++++++---------------- 2 files changed, 110 insertions(+), 50 deletions(-) diff --git a/.DS_Store b/.DS_Store index 63c701de5065285f388304b5f82c6fbf7f26e71f..806685c828e6d9942e72889651744c311cb5f942 100644 GIT binary patch delta 279 zcmZp1XmQx^U5N4QSE#&qLNaQGVub!Nr}nX=|%aac`45MIr&9SIi;x)naTNi z!I@R5lf8v^)yE6)7iZ*`djiD*ic-rmQ_G{%i!xJ!3lftv^U{^=KQMrSvO@rjp#fnC zFepP93=GN+jS^rshX_mvN;7hX6;3ycmKRG8oDk`n(usF)U-) z!Elt}7Q-8cUyLk_VvI_R+KeWQwv6_S9*lvEL5#_aDU6wnSr7x57@-EqLTM<)SUmZI Wpv>lLB5KT=*(JWQZ2ly|&I|xylsZ5F delta 274 zcmZp1XmQx^U5N3}L~Y@&`eg%@0M? Wm?su+Z)TVH# max_temperature: max_temperature = temperature - date_max_temp = max_temp_row["PKT"] + try: + date_max_temp = max_temp_row["PKT"] + except: + date_max_temp = max_temp_row["PKST"] min_temp_index = df["Min TemperatureC"].idxmin() min_temp_row = df.loc[min_temp_index] temperature = min_temp_row["Min TemperatureC"] if temperature < min_temperature: min_temperature = temperature - date_min_temp = min_temp_row["PKT"] + try: + date_min_temp = min_temp_row["PKT"] + except: + date_min_temp = min_temp_row["PKST"] max_humid_index = df["Max Humidity"].idxmax() max_humid_row = df.loc[max_humid_index] humidity = max_humid_row["Max Humidity"] if humidity > max_humidity: max_humidity = humidity - date_max_humid = max_humid_row["PKT"] - - results = { - "max_temperature": max_temperature, - "min_temperature": min_temperature, - "max_humidity": max_humidity, - "date_max_temp": date_max_temp, - "date_min_temp": date_min_temp, - "date_max_humid": date_max_humid, - } - return results + try: + date_max_humid = max_humid_row["PKT"] + except: + date_max_humid = max_humid_row["PKST"] + + if record_found: + results = { + "max_temperature": max_temperature, + "min_temperature": min_temperature, + "max_humidity": max_humidity, + "date_max_temp": date_max_temp, + "date_min_temp": date_min_temp, + "date_max_humid": date_max_humid, + } + return results + else: + return None def generate_report_extremes(weather_readings, year): - """Generates a report summarizing weather extremes for a year. + """Generates a report summarizing weather extremes for a year.""" + + extremes = stats_extremes(weather_readings, year) + print(f"\n***** Report for the year {year}: *****") + if extremes is not None: + date_max_temp = extremes["date_max_temp"].split("-") + date_min_temp = extremes["date_min_temp"].split("-") + date_humidity = extremes["date_max_humid"].split("-") + + print( + f"Highest: {extremes['max_temperature']}C on {MONTHS[int(date_max_temp[1])]} {date_max_temp[2]}" + ) + print( + f"Lowest: {extremes['min_temperature']}C on {MONTHS[int(date_min_temp[1])]} {date_min_temp[2]}" + ) + print( + f"Humidity: {extremes['max_humidity']}% on {MONTHS[int(date_humidity[1])]} {date_humidity[2]}" + ) + else: + print("Sorry! No records found against your input") + print("-------------------------------------") - This function takes the results of `stats_extremes` for a given year and - formats them into a well-defined report. + +def stats_averages(weather_readings, year, month): + """Calculates average highest temperature, average lowest temperature, + and average mean humidity for a given year and month. Args: weather_readings (dict): A dictionary where readings are stored as pandas dataframes. - year (int): The year for which the report is generated. + year (int): The year for which to calculate averages. + month (int): The month (1-12) for which to calculate averages. Returns: - None + dict: A dictionary containing the following keys if data is found for the + specified year and month: + - 'avg_highest_temp': Average of the daily maximum temperatures in °C. + - 'avg_lowest_temp': Average of the daily minimum temperatures in °C. + - 'avg_mean_humidity': Average of the daily mean humidity values. + None: If no data is found for the specified year and month. """ - extremes = stats_extremes(weather_readings, year) - date_max_temp = extremes["date_max_temp"].split("-") - date_min_temp = extremes["date_min_temp"].split("-") - date_humidity = extremes["date_max_humid"].split("-") - - print( - f"""Highest: {extremes["max_temperature"]}C on {MONTHS[int(date_max_temp[1])]} {date_max_temp[2]}\nLowest: {extremes["min_temperature"]}C on {MONTHS[int(date_min_temp[1])]} {date_min_temp[2]}\nHumidity: {extremes["max_humidity"]}% on {MONTHS[int(date_humidity[1])]} {date_humidity[2]} - """ - ) - - -def stats_averages(weather_readings, year, month): - pass - - -def stats_chart(weather_readings, year, month): + record_found = False + mon = MONTHS[month][:3] + year_month = str(year) + "_" + mon + for key in weather_readings.keys(): + if key == year_month: + record_found = True + avg_highest_temp = weather_readings[key]["Max TemperatureC"].mean() + avg_lowest_temp = weather_readings[key]["Min TemperatureC"].mean() + avg_mean_humidity = weather_readings[key][" Mean Humidity"].mean() + break + + if record_found: + results = { + "avg_highest_temp": avg_highest_temp, + "avg_lowest_temp": avg_lowest_temp, + "avg_mean_humidity": avg_mean_humidity, + } + return results + return None + + +def generate_report_averages(weather_readings, year, month): + """Generates a report summarizing average weather statistics for a given year and month.""" + + averages = stats_averages(weather_readings, year, month) + print(f"\n***** Report for the month: {MONTHS[month]} {year} *****") + if averages is not None: + print(f"Highest Average: {averages['avg_highest_temp']}C") + print(f"Lowest Average: {averages['avg_lowest_temp']}C") + print(f"Average Mean Humidity: {averages['avg_mean_humidity']}%") + else: + print("Sorry! No records found against your input") + print("-------------------------------------") + + +def generate_chart(weather_readings, year, month): pass @@ -166,9 +229,6 @@ def stats_chart(weather_readings, year, month): extract_files(args.extract_path) weather_readings = parse(args.extract_path) - # print(weather_readings["2006_Apr"].head()) - # cols = weather_readings["2006_Apr"].columns - # print(cols) if args.extremes is not None: year = int(args.extremes) @@ -178,10 +238,10 @@ def stats_chart(weather_readings, year, month): inp = args.averages.split("/") year = int(inp[0]) month = int(inp[1]) - stats_averages(weather_readings, year, month) + generate_report_averages(weather_readings, year, month) if args.chart is not None: inp = args.averages.split("/") year = int(inp[0]) month = int(inp[1]) - stats_chart(weather_readings, year, month) + generate_chart(weather_readings, year, month) From e0b544360075196684e8ccfd76169f3b9e1358c3 Mon Sep 17 00:00:00 2001 From: Muhammad Tayayb Tahir Qureshi Date: Wed, 12 Jun 2024 12:30:16 +0500 Subject: [PATCH 05/29] Bar charts for daily temperatures of a month --- .DS_Store | Bin 8196 -> 8196 bytes weatherman.py | 30 ++++++++++++++++++++++++++++-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/.DS_Store b/.DS_Store index 806685c828e6d9942e72889651744c311cb5f942..b4f43abb253de68fe15464aef56c81e218a70d9c 100644 GIT binary patch delta 23 ecmZp1XmQxkC&Xr|qhMlgGFeK{e)DA^LtX$^IR?@I delta 23 ecmZp1XmQxkC&Xr=qhMlgJXuQ6e)DA^LtX$^AO_F? diff --git a/weatherman.py b/weatherman.py index 2b3d159..a97d085 100644 --- a/weatherman.py +++ b/weatherman.py @@ -2,6 +2,7 @@ import zipfile import os import pandas as pd +import math MONTHS = { 1: "January", @@ -214,8 +215,33 @@ def generate_report_averages(weather_readings, year, month): def generate_chart(weather_readings, year, month): - pass + RED = "\033[91m" + BLUE = "\033[94m" + RESET = "\033[0m" + record_found = False + mon = MONTHS[month][:3] + year_month = str(year) + "_" + mon + for key in weather_readings.keys(): + if key == year_month: + record_found = True + print(f"\n{MONTHS[month]} {year}") + for _, row in weather_readings[key].iterrows(): + try: + date = row['PKT'].split("-") + except: + date = row['PKST'].split("-") + + if not math.isnan(row['Max TemperatureC']): + temp_high = int(row['Max TemperatureC']) + temp_low = int(row['Min TemperatureC']) + + print(f"{date[-1]} {RED + ('+' * temp_high) + RESET} {temp_high}C") + print(f"{date[-1]} {BLUE + ('+' * temp_low) + RESET} {temp_low}C") + break + if not record_found: + print("Sorry! No records found against your input") + if __name__ == "__main__": parser = argparse.ArgumentParser() @@ -241,7 +267,7 @@ def generate_chart(weather_readings, year, month): generate_report_averages(weather_readings, year, month) if args.chart is not None: - inp = args.averages.split("/") + inp = args.chart.split("/") year = int(inp[0]) month = int(inp[1]) generate_chart(weather_readings, year, month) From eb2e33675d337a53203f2c8aea23aec3e5572c05 Mon Sep 17 00:00:00 2001 From: Muhammad Tayayb Tahir Qureshi Date: Wed, 12 Jun 2024 12:49:05 +0500 Subject: [PATCH 06/29] One line bar chart --- weatherman.py | 38 ++++++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/weatherman.py b/weatherman.py index a97d085..3f47798 100644 --- a/weatherman.py +++ b/weatherman.py @@ -214,7 +214,9 @@ def generate_report_averages(weather_readings, year, month): print("-------------------------------------") -def generate_chart(weather_readings, year, month): +def generate_chart(weather_readings, year, month, isInline): + """Generates bar chart of daily highest and lowest temperatures for a given month.""" + RED = "\033[91m" BLUE = "\033[94m" RESET = "\033[0m" @@ -228,20 +230,30 @@ def generate_chart(weather_readings, year, month): print(f"\n{MONTHS[month]} {year}") for _, row in weather_readings[key].iterrows(): try: - date = row['PKT'].split("-") + date = row["PKT"].split("-") except: - date = row['PKST'].split("-") - - if not math.isnan(row['Max TemperatureC']): - temp_high = int(row['Max TemperatureC']) - temp_low = int(row['Min TemperatureC']) - - print(f"{date[-1]} {RED + ('+' * temp_high) + RESET} {temp_high}C") - print(f"{date[-1]} {BLUE + ('+' * temp_low) + RESET} {temp_low}C") + date = row["PKST"].split("-") + + if not math.isnan(row["Max TemperatureC"]): + temp_high = int(row["Max TemperatureC"]) + temp_low = int(row["Min TemperatureC"]) + + if isInline: + print( + f"{date[-1]} {BLUE + ('+' * temp_low) + RED + ('+' * temp_high) + BLUE} {temp_low}C{RESET} - {RED}{temp_high}C{RESET}" + ) + else: + print( + f"{date[-1]} {RED + ('+' * temp_high) + RESET} {temp_high}C" + ) + print( + f"{date[-1]} {BLUE + ('+' * temp_low) + RESET} {temp_low}C" + ) break + if not record_found: print("Sorry! No records found against your input") - + if __name__ == "__main__": parser = argparse.ArgumentParser() @@ -250,6 +262,7 @@ def generate_chart(weather_readings, year, month): parser.add_argument("-e", "--extremes") parser.add_argument("-a", "--averages") parser.add_argument("-c", "--chart") + parser.add_argument("--inline", action="store_true") args = parser.parse_args() @@ -267,7 +280,8 @@ def generate_chart(weather_readings, year, month): generate_report_averages(weather_readings, year, month) if args.chart is not None: + print(f"Inline: {args.inline}") inp = args.chart.split("/") year = int(inp[0]) month = int(inp[1]) - generate_chart(weather_readings, year, month) + generate_chart(weather_readings, year, month, args.inline) From 28434c5d25bf890249d760e8bcb993895867fe10 Mon Sep 17 00:00:00 2001 From: Muhammad Tayayb Tahir Qureshi Date: Wed, 12 Jun 2024 13:02:45 +0500 Subject: [PATCH 07/29] Add README --- README.md | 17 +++++++++++++++++ weatherman.py | 1 - 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..2f0d132 --- /dev/null +++ b/README.md @@ -0,0 +1,17 @@ +# WEATHER MAN + + +1. To get the highest temperature, lowest temperature and humidity for a given year, run: +```weatherman.py dir/path/for/files/extraction -e 2006``` + +2. To get the average highest temperature​, average lowest temperature​,​ average mean humidity​ for a month, run: +```weatherman.py dir/path/for/files/extraction -a 2006/5``` + +3. To draw horizontal bar charts on the console for highest and lowest temperature on each day, run: +```weatherman.py dir/path/for/files/extraction -c 2006/5``` + +4. Multiple reports can be generated by passing multiple arguments, like: +```weatherman.py dir/path/for/files/extraction -c 2011/03 -a 2011/3 -e 2011``` + +5. For a given month, to get one horizontal bar chart per day, add --inline flag to the command: +```weatherman.py dir/path/for/files/extraction -c 2011/3 --inline``` \ No newline at end of file diff --git a/weatherman.py b/weatherman.py index 3f47798..3a4410d 100644 --- a/weatherman.py +++ b/weatherman.py @@ -280,7 +280,6 @@ def generate_chart(weather_readings, year, month, isInline): generate_report_averages(weather_readings, year, month) if args.chart is not None: - print(f"Inline: {args.inline}") inp = args.chart.split("/") year = int(inp[0]) month = int(inp[1]) From b2c6ec37a83ac571683f136ded134deb8f54c6df Mon Sep 17 00:00:00 2001 From: Muhammad Tayayb Tahir Qureshi Date: Wed, 12 Jun 2024 13:03:39 +0500 Subject: [PATCH 08/29] Update README --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 2f0d132..0b0ca2c 100644 --- a/README.md +++ b/README.md @@ -2,16 +2,21 @@ 1. To get the highest temperature, lowest temperature and humidity for a given year, run: + ```weatherman.py dir/path/for/files/extraction -e 2006``` 2. To get the average highest temperature​, average lowest temperature​,​ average mean humidity​ for a month, run: + ```weatherman.py dir/path/for/files/extraction -a 2006/5``` 3. To draw horizontal bar charts on the console for highest and lowest temperature on each day, run: + ```weatherman.py dir/path/for/files/extraction -c 2006/5``` 4. Multiple reports can be generated by passing multiple arguments, like: + ```weatherman.py dir/path/for/files/extraction -c 2011/03 -a 2011/3 -e 2011``` 5. For a given month, to get one horizontal bar chart per day, add --inline flag to the command: + ```weatherman.py dir/path/for/files/extraction -c 2011/3 --inline``` \ No newline at end of file From 8df84b24c245dafd9d7361a82e6e1b36d0fd0a29 Mon Sep 17 00:00:00 2001 From: "M. Tayyab Tahir Qureshi" <109274085+ttqureshi@users.noreply.github.com> Date: Wed, 12 Jun 2024 13:38:20 +0500 Subject: [PATCH 09/29] Update README.md --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0b0ca2c..d717ebf 100644 --- a/README.md +++ b/README.md @@ -19,4 +19,7 @@ 5. For a given month, to get one horizontal bar chart per day, add --inline flag to the command: -```weatherman.py dir/path/for/files/extraction -c 2011/3 --inline``` \ No newline at end of file +```weatherman.py dir/path/for/files/extraction -c 2011/3 --inline``` + +## Note: +Enter `./` in place of `dir/path/for/files/extraction` for current working directory From efbce2b02ab9a8d10edc2c1fe8b47d9d3e50e915 Mon Sep 17 00:00:00 2001 From: "M. Tayyab Tahir Qureshi" <109274085+ttqureshi@users.noreply.github.com> Date: Wed, 12 Jun 2024 16:28:45 +0500 Subject: [PATCH 10/29] Update .gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 95a7acd..b30f142 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ Weatherman.pdf rough/ weatherfiles/ -main.py \ No newline at end of file +main.py From 55c418ad364fb7854d167f3d133968134ea713b2 Mon Sep 17 00:00:00 2001 From: Muhammad Tayayb Tahir Qureshi Date: Thu, 13 Jun 2024 11:29:11 +0500 Subject: [PATCH 11/29] Refactoring: Parser class implemented --- weatherman.py | 334 ++++++++++---------------------------------------- 1 file changed, 62 insertions(+), 272 deletions(-) diff --git a/weatherman.py b/weatherman.py index 3a4410d..9a2548b 100644 --- a/weatherman.py +++ b/weatherman.py @@ -1,286 +1,76 @@ -import argparse import zipfile +from dataclasses import dataclass import os -import pandas as pd -import math - -MONTHS = { - 1: "January", - 2: "February", - 3: "March", - 4: "April", - 5: "May", - 6: "June", - 7: "July", - 8: "August", - 9: "September", - 10: "October", - 11: "November", - 12: "December", -} - - -def extract_files(path): - """Extracts files from a weatherfiles archive. - - Args: - path (str): The path to the directory where the extracted files will be placed. - - Raises: - RuntimeError: If there are any errors during extraction. - """ - try: - with zipfile.ZipFile("weatherfiles.zip", "r") as zip_ref: - zip_ref.extractall(path) - except zipfile.ZipFile as e: - raise RuntimeError(f"Error extracting files: {e}") - - -def parse(path): - """Parses weather data from TXT files within a directory. - - Args: - path (str): The path to the directory containing the 'weatherfiles' - subdirectory. - - Returns: - weather_readings (dict): A dictionary where readings are stored as - pandas dataframes. - """ - weather_readings = {} - dir_path = os.path.join(path, "weatherfiles") - for filename in os.listdir(dir_path): - file_path = os.path.join(dir_path, filename) - - # making the key to be of the format: '2006_Apr' - key = filename.split("_")[2:] - key[-1] = key[-1].split(".")[0] - key = "_".join(key) - - df = pd.read_csv(file_path, delimiter=",") - weather_readings[key] = df - return weather_readings - - -def stats_extremes(weather_readings, year): - """Calculates weather extremes for a specific year. - - Args: - weather_readings (dict): A dictionary where readings are stored as - pandas dataframes. - year (int): The year for which to calculate weather extremes. - - Returns: - dict: A dictionary containing the following keys: - - 'max_temperature': The maximum temperature. - - 'min_temperature': The minimum temperature. - - 'max_humidity': The maximum humidity percentage. - - 'date_max_temp': The date (PKT format) with the maximum temperature. - - 'date_min_temp': The date (PKT format) with the minimum temperature. - - 'date_max_humid': The date (PKT format) with the maximum humidity. - None: If no data is found for the specified year and month. - """ - record_found = False - max_temperature = -100 - min_temperature = 100 - max_humidity = 0 - date_max_temp = "" - date_min_temp = "" - date_max_humid = "" - - for key in weather_readings.keys(): - if key.startswith(str(year)): - record_found = True - df = weather_readings[key] - - max_temp_index = df["Max TemperatureC"].idxmax() - max_temp_row = df.loc[max_temp_index] - temperature = max_temp_row["Max TemperatureC"] - if temperature > max_temperature: - max_temperature = temperature - try: - date_max_temp = max_temp_row["PKT"] - except: - date_max_temp = max_temp_row["PKST"] - - min_temp_index = df["Min TemperatureC"].idxmin() - min_temp_row = df.loc[min_temp_index] - temperature = min_temp_row["Min TemperatureC"] - if temperature < min_temperature: - min_temperature = temperature - try: - date_min_temp = min_temp_row["PKT"] - except: - date_min_temp = min_temp_row["PKST"] - - max_humid_index = df["Max Humidity"].idxmax() - max_humid_row = df.loc[max_humid_index] - humidity = max_humid_row["Max Humidity"] - if humidity > max_humidity: - max_humidity = humidity - try: - date_max_humid = max_humid_row["PKT"] - except: - date_max_humid = max_humid_row["PKST"] - - if record_found: - results = { - "max_temperature": max_temperature, - "min_temperature": min_temperature, - "max_humidity": max_humidity, - "date_max_temp": date_max_temp, - "date_min_temp": date_min_temp, - "date_max_humid": date_max_humid, - } - return results - else: - return None - - -def generate_report_extremes(weather_readings, year): - """Generates a report summarizing weather extremes for a year.""" - - extremes = stats_extremes(weather_readings, year) - print(f"\n***** Report for the year {year}: *****") - if extremes is not None: - date_max_temp = extremes["date_max_temp"].split("-") - date_min_temp = extremes["date_min_temp"].split("-") - date_humidity = extremes["date_max_humid"].split("-") - - print( - f"Highest: {extremes['max_temperature']}C on {MONTHS[int(date_max_temp[1])]} {date_max_temp[2]}" - ) - print( - f"Lowest: {extremes['min_temperature']}C on {MONTHS[int(date_min_temp[1])]} {date_min_temp[2]}" - ) - print( - f"Humidity: {extremes['max_humidity']}% on {MONTHS[int(date_humidity[1])]} {date_humidity[2]}" - ) - else: - print("Sorry! No records found against your input") - print("-------------------------------------") - - -def stats_averages(weather_readings, year, month): - """Calculates average highest temperature, average lowest temperature, - and average mean humidity for a given year and month. - - Args: - weather_readings (dict): A dictionary where readings are stored as - pandas dataframes. - year (int): The year for which to calculate averages. - month (int): The month (1-12) for which to calculate averages. - - Returns: - dict: A dictionary containing the following keys if data is found for the - specified year and month: - - 'avg_highest_temp': Average of the daily maximum temperatures in °C. - - 'avg_lowest_temp': Average of the daily minimum temperatures in °C. - - 'avg_mean_humidity': Average of the daily mean humidity values. - None: If no data is found for the specified year and month. - """ - record_found = False - mon = MONTHS[month][:3] - year_month = str(year) + "_" + mon - for key in weather_readings.keys(): - if key == year_month: - record_found = True - avg_highest_temp = weather_readings[key]["Max TemperatureC"].mean() - avg_lowest_temp = weather_readings[key]["Min TemperatureC"].mean() - avg_mean_humidity = weather_readings[key][" Mean Humidity"].mean() - break - - if record_found: - results = { - "avg_highest_temp": avg_highest_temp, - "avg_lowest_temp": avg_lowest_temp, - "avg_mean_humidity": avg_mean_humidity, - } - return results - return None - - -def generate_report_averages(weather_readings, year, month): - """Generates a report summarizing average weather statistics for a given year and month.""" - - averages = stats_averages(weather_readings, year, month) - print(f"\n***** Report for the month: {MONTHS[month]} {year} *****") - if averages is not None: - print(f"Highest Average: {averages['avg_highest_temp']}C") - print(f"Lowest Average: {averages['avg_lowest_temp']}C") - print(f"Average Mean Humidity: {averages['avg_mean_humidity']}%") - else: - print("Sorry! No records found against your input") - print("-------------------------------------") - - -def generate_chart(weather_readings, year, month, isInline): - """Generates bar chart of daily highest and lowest temperatures for a given month.""" - - RED = "\033[91m" - BLUE = "\033[94m" - RESET = "\033[0m" +import csv +import argparse - record_found = False - mon = MONTHS[month][:3] - year_month = str(year) + "_" + mon - for key in weather_readings.keys(): - if key == year_month: - record_found = True - print(f"\n{MONTHS[month]} {year}") - for _, row in weather_readings[key].iterrows(): +@dataclass +class WeatherReading: + date: str + max_temp: int + mean_temp: int + min_temp: int + max_humidity: int + mean_humidity: int + min_humidity: int + + +class Parser: + def __init__(self, extract_to): + self.extract_to = extract_to + self.weather_readings = [] + + def extract_zip(self, extract_to): + try: + with zipfile.ZipFile("weatherfiles.zip", "r") as zip_ref: + zip_ref.extractall(extract_to) + except zipfile.ZipFile as e: + raise RuntimeError(f"Error extracting files: {e}") + + def parse_weather_file(self, path): + with open(path, 'r') as file: + reader = csv.DictReader(file) + for row in reader: try: - date = row["PKT"].split("-") - except: - date = row["PKST"].split("-") - - if not math.isnan(row["Max TemperatureC"]): - temp_high = int(row["Max TemperatureC"]) - temp_low = int(row["Min TemperatureC"]) - - if isInline: - print( - f"{date[-1]} {BLUE + ('+' * temp_low) + RED + ('+' * temp_high) + BLUE} {temp_low}C{RESET} - {RED}{temp_high}C{RESET}" - ) - else: - print( - f"{date[-1]} {RED + ('+' * temp_high) + RESET} {temp_high}C" - ) - print( - f"{date[-1]} {BLUE + ('+' * temp_low) + RESET} {temp_low}C" - ) - break + reading = WeatherReading( + date=row[list(row.keys())[0]], + max_temp=int(row['Max TemperatureC']), + mean_temp=int(row['Mean TemperatureC']), + min_temp=int(row['Min TemperatureC']), + max_humidity=int(row['Max Humidity']), + mean_humidity=int(row[' Mean Humidity']), + min_humidity=int(row[' Min Humidity']) + ) + self.weather_readings.append(reading) + except ValueError: + continue + + def parse_all_files(self): + dir_path = os.path.join(self.extract_to, 'weatherfiles') + for filename in os.listdir(dir_path): + file_path = os.path.join(dir_path, filename) + self.parse_weather_file(file_path) - if not record_found: - print("Sorry! No records found against your input") if __name__ == "__main__": parser = argparse.ArgumentParser() - - parser.add_argument("extract_path") - parser.add_argument("-e", "--extremes") - parser.add_argument("-a", "--averages") - parser.add_argument("-c", "--chart") - parser.add_argument("--inline", action="store_true") + parser.add_argument('extract_to', type=str) + parser.add_argument('-e', '--extremes', type=int) + parser.add_argument('-a', '--averages', type=str) + parser.add_argument('-c', '--chart', type=str) args = parser.parse_args() - extract_files(args.extract_path) - weather_readings = parse(args.extract_path) - - if args.extremes is not None: - year = int(args.extremes) - generate_report_extremes(weather_readings, year) + parser = Parser(args.extract_to) + parser.parse_all_files() + print(parser.weather_readings[0]) - if args.averages is not None: - inp = args.averages.split("/") - year = int(inp[0]) - month = int(inp[1]) - generate_report_averages(weather_readings, year, month) + if args.extremes: + print(args.extremes) + + if args.averages: + print(args.averages) - if args.chart is not None: - inp = args.chart.split("/") - year = int(inp[0]) - month = int(inp[1]) - generate_chart(weather_readings, year, month, args.inline) + if args.chart: + print(args.chart) From e93578b108e2ad0173bbba9c689bc4478034aeb6 Mon Sep 17 00:00:00 2001 From: Muhammad Tayayb Tahir Qureshi Date: Thu, 13 Jun 2024 11:29:11 +0500 Subject: [PATCH 12/29] Refactoring: Parser class implemented --- weatherman.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/weatherman.py b/weatherman.py index 9a2548b..7ff5d2b 100644 --- a/weatherman.py +++ b/weatherman.py @@ -1,5 +1,6 @@ import zipfile from dataclasses import dataclass +from dataclasses import dataclass import os import csv import argparse @@ -21,6 +22,14 @@ def __init__(self, extract_to): self.weather_readings = [] def extract_zip(self, extract_to): + """Extracts files from a weatherfiles archive. + + Args: + path (str): The path to the directory where the extracted files will be placed. + + Raises: + RuntimeError: If there are any errors during extraction. + """ try: with zipfile.ZipFile("weatherfiles.zip", "r") as zip_ref: zip_ref.extractall(extract_to) @@ -28,6 +37,12 @@ def extract_zip(self, extract_to): raise RuntimeError(f"Error extracting files: {e}") def parse_weather_file(self, path): + """Parses a TXT file containing weather data. + + This method reads a TXT file at the specified path and populates the + weather_readings list of the class with WeatherReading objects. Each + object represents a day's weather data. + """ with open(path, 'r') as file: reader = csv.DictReader(file) for row in reader: @@ -46,6 +61,8 @@ def parse_weather_file(self, path): continue def parse_all_files(self): + """Parses all weather data files in the 'weatherfiles' directory.""" + dir_path = os.path.join(self.extract_to, 'weatherfiles') for filename in os.listdir(dir_path): file_path = os.path.join(dir_path, filename) From 5b854ba1751562d6103a0f7c2e01e479d9352dd8 Mon Sep 17 00:00:00 2001 From: Muhammad Tayayb Tahir Qureshi Date: Thu, 13 Jun 2024 17:00:09 +0500 Subject: [PATCH 13/29] Refactoring completed: Made use of classes for calculations and reporting --- .DS_Store | Bin 8196 -> 0 bytes .gitignore | 3 +- code_files/computations.py | 41 ++++++++++++++ weatherman.py => code_files/file_parser.py | 50 ++--------------- code_files/main.py | 33 +++++++++++ code_files/weather_readings.py | 10 ++++ code_files/weather_reporter.py | 62 +++++++++++++++++++++ weatherfiles.zip | Bin 142616 -> 0 bytes 8 files changed, 154 insertions(+), 45 deletions(-) delete mode 100644 .DS_Store create mode 100644 code_files/computations.py rename weatherman.py => code_files/file_parser.py (61%) create mode 100644 code_files/main.py create mode 100644 code_files/weather_readings.py create mode 100644 code_files/weather_reporter.py delete mode 100644 weatherfiles.zip diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index b4f43abb253de68fe15464aef56c81e218a70d9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8196 zcmeHMPfr_16n{gUW?i6O5+G2e(kfP^Nf7S$*F7%4&MUfMMWNG9dN`2M>WojU9z@>%dNy0Eih>%Z9Qo1Vl$;QDa9TTCfon zil{<~E-{D-N4=x{iW)l#RX7k`d=Nb|(G?1jv*Y-VbO%yYXnMndVc;kOqIS=~RcL?@ zNpJnW{vvH_@^ZNv@G9!8y~#JZr-QHV^xEtHXb(42-v-DuhQe8hfI|!C-mJFcP>;S} z4Ff+;rl)@+17|X4KRRbw)}XcSZt}L9cu6ZRdC{6UTjo5dc4e=6->2=0J$je3#Pb=A zWPo3%=ii*_(29XJ@9ToWk{+dwW@H zEdS-LrOM-=$@tG=$+)rT4G4zS`TPDUN~tUAU1kPK-@{I(eyLU#NPu$Bjtj%v~Pvs1&s5ieKZ* z^>^q>LZ2i;sMzNZ`7P1KBt978PB7Y4X(ZWY#u?4# zi{ELD1y|q>dL%t_Vq(S?^3F#`C^6{ZR7T{gNLyz8!oJ!uf#L^!8)pxME|w`c^hM>+qrYCO$|EV?)^P zjU-}~=|~xFI>W$8WZ;Zi)P$)2zwZD2|0FKmtjRE782CU8kWASvmvFG|yY}$7qSkis zc!Y;&!mp!HhF~YlaYR{;BfkH`5M>8lMNCm+M") + print(f"Highest: {h_temp.max_temp}C on {MONTHS[int(date_htemp[1])]} {date_htemp[2]}") + print(f"Lowest: {l_temp.min_temp}C on {MONTHS[int(date_ltemp[1])]} {date_ltemp[2]}") + print(f"Humidity: {h_humidity.max_humidity}% on {MONTHS[int(date_hhumid[1])]} {date_hhumid[2]}") + print("-------------------------------------") + + def generate_report_averages(year, month, readings): + """Generates a report summarizing average weather statistics for a given year and month.""" + + avg_max_temp, avg_min_temp, avg_mean_humidity = Computations.compute_average_stats(readings) + + print(f"\n<==== Report for the month: {MONTHS[month]} {year} ====>") + print(f"Highest Average: {avg_max_temp:.1f}C") + print(f"Lowest Average: {avg_min_temp:.1f}C") + print(f"Average Mean Humidity: {avg_mean_humidity:.1f}%") + print("-------------------------------------") + + def generate_report_barchart(year, month, readings, isInline): + """Generates bar chart of daily highest and lowest temperatures for a given month of the year""" + + RED = "\033[91m" + BLUE = "\033[94m" + RESET = "\033[0m" + + print(f"\n<==== Temperature Bar Charts for {MONTHS[month]} {year} ====>") + for reading in readings: + high_bar = '+' * reading.max_temp + low_bar = '+' * reading.min_temp + day = reading.date.split('-')[-1] + if isInline: + print(f"{day + BLUE} {low_bar + RED} {high_bar} {BLUE}{reading.min_temp}C{RESET + ' - ' + RED}{reading.max_temp}C{RESET}") + else: + print(f"{day + RED} {high_bar} {reading.max_temp}C{RESET}") + print(f"{day + BLUE} {low_bar} {reading.min_temp}C{RESET}") + diff --git a/weatherfiles.zip b/weatherfiles.zip deleted file mode 100644 index a6198b7842eacc4a6e838d15003446ef06eb64e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 142616 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 vRDGb~IY={&gVa;=a8$6rLhIMRw42e Date: Thu, 20 Jun 2024 17:32:54 +0500 Subject: [PATCH 14/29] Making suggested changes - moved main.py outside of code_files directory and renamed it to weatherman.py - Computations -> ReportCalculator (renamed) - Parser -> WeatherParser (renamed) - separate class for constants - Using WeatherReporter for printing only. All calculations moved to ReportCalculator class - Handled missing values in data - If user asks for a year or month against which there is no record in the data, shows a message No Record Found instead of throwing error --- .gitignore | 3 +- code_files/constants.py | 21 ++++++ code_files/file_parser.py | 55 -------------- code_files/main.py | 33 --------- .../{computations.py => report_calculator.py} | 41 ++++++++--- code_files/weather_parser.py | 48 ++++++++++++ code_files/weather_readings.py | 27 +++++-- code_files/weather_reporter.py | 73 +++++++------------ weatherman.py | 61 ++++++++++++++++ 9 files changed, 212 insertions(+), 150 deletions(-) create mode 100644 code_files/constants.py delete mode 100644 code_files/file_parser.py delete mode 100644 code_files/main.py rename code_files/{computations.py => report_calculator.py} (51%) create mode 100644 code_files/weather_parser.py create mode 100644 weatherman.py diff --git a/.gitignore b/.gitignore index af9dbd6..dfdf365 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ Weatherman.pdf rough/ weatherfiles/ -code_files/weatherfiles.zip +weatherfiles.zip +FileTree.ini diff --git a/code_files/constants.py b/code_files/constants.py new file mode 100644 index 0000000..8d12943 --- /dev/null +++ b/code_files/constants.py @@ -0,0 +1,21 @@ +class Colors: + RED = "\033[91m" + BLUE = "\033[94m" + RESET = "\033[0m" + + +class MonthsMapping: + MONTHS = { + 1: "January", + 2: "February", + 3: "March", + 4: "April", + 5: "May", + 6: "June", + 7: "July", + 8: "August", + 9: "September", + 10: "October", + 11: "November", + 12: "December", + } diff --git a/code_files/file_parser.py b/code_files/file_parser.py deleted file mode 100644 index 3469aac..0000000 --- a/code_files/file_parser.py +++ /dev/null @@ -1,55 +0,0 @@ -import os -import csv -import zipfile -from weather_readings import WeatherReading - -class Parser: - def __init__(self, extract_to): - self.extract_to = extract_to - self.weather_readings = [] - - def extract_zip(self): - """Extracts files from a weatherfiles archive. - - Args: - extract_to (str): The path to the directory where the extracted files will be placed. - - Raises: - RuntimeError: If there are any errors during extraction. - """ - try: - with zipfile.ZipFile("weatherfiles.zip", "r") as zip_ref: - zip_ref.extractall(self.extract_to) - except zipfile.ZipFile as e: - raise RuntimeError(f"Error extracting files: {e}") - - def parse_weather_file(self, path): - """Parses a TXT file containing weather data. - - This method reads a TXT file at the specified path and populates the - weather_readings list of the class with WeatherReading objects. Each - object represents a day's weather data. - """ - with open(path, 'r') as file: - reader = csv.DictReader(file) - for row in reader: - try: - reading = WeatherReading( - date=row[list(row.keys())[0]], - max_temp=int(row['Max TemperatureC']), - min_temp=int(row['Min TemperatureC']), - max_humidity=int(row['Max Humidity']), - mean_humidity=int(row[' Mean Humidity']) - ) - self.weather_readings.append(reading) - except ValueError: - continue - - def parse_all_files(self): - """Parses all weather data files in the 'weatherfiles' directory.""" - - dir_path = os.path.join(self.extract_to, 'weatherfiles') - for filename in os.listdir(dir_path): - file_path = os.path.join(dir_path, filename) - self.parse_weather_file(file_path) - diff --git a/code_files/main.py b/code_files/main.py deleted file mode 100644 index 8f38e67..0000000 --- a/code_files/main.py +++ /dev/null @@ -1,33 +0,0 @@ -import argparse -from file_parser import Parser -from weather_reporter import WeatherReporter - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument('extract_to', type=str) - parser.add_argument('-e', '--extremes', type=int) - parser.add_argument('-a', '--averages', type=str) - parser.add_argument('-c', '--chart', type=str) - parser.add_argument('--inline', action='store_true') - - args = parser.parse_args() - - parser = Parser(args.extract_to) - parser.extract_zip() - parser.parse_all_files() - - if args.extremes: - yearly_readings = [r for r in parser.weather_readings if r.date.startswith(str(args.extremes))] - WeatherReporter.generate_report_extremes(yearly_readings) - - if args.averages: - year, month = map(int, args.averages.split('/')) - monthly_readings = [r for r in parser.weather_readings if r.date.startswith(f"{year}-{month}")] - WeatherReporter.generate_report_averages(year, month, monthly_readings) - - if args.chart: - year, month = map(int, args.chart.split('/')) - monthly_readings = [r for r in parser.weather_readings if r.date.startswith(f"{year}-{month}")] - WeatherReporter.generate_report_barchart(year, month, monthly_readings, args.inline) - - diff --git a/code_files/computations.py b/code_files/report_calculator.py similarity index 51% rename from code_files/computations.py rename to code_files/report_calculator.py index 3124f03..a05209b 100644 --- a/code_files/computations.py +++ b/code_files/report_calculator.py @@ -1,4 +1,7 @@ -class Computations: +from code_files.weather_readings import WeatherExtremes + + +class ReportCalculator: @staticmethod def compute_extreme_stats(readings): """Computes the extreme weather statistics for a particular year @@ -7,15 +10,34 @@ def compute_extreme_stats(readings): readings (list): The list of WeatherReading objects of the given year Returns: - highest_temp: Highest temperature throughout the year - lowest_temp: Lowest temperature throughout the year - highest_humidity: Highest humidity throughout the year + weather_extremes (obj): Extreme weather stats of the year """ - highest_temp = max(readings, key=lambda r: r.max_temp) - lowest_temp = min(readings, key=lambda r: r.min_temp) - highest_humidity = max(readings, key=lambda r: r.max_humidity) - return highest_temp, lowest_temp, highest_humidity - + highest_temp_reading = max( + readings, + key=lambda r: r.max_temp if r.max_temp is not None else float("-inf"), + ) + lowest_temp_reading = min( + readings, + key=lambda r: r.min_temp if r.min_temp is not None else float("inf"), + ) + highest_humidity_reading = max( + readings, + key=lambda r: ( + r.max_humidity if r.max_humidity is not None else float("-inf") + ), + ) + + weather_extremes = WeatherExtremes( + highest_temp=highest_temp_reading.max_temp, + lowest_temp=lowest_temp_reading.min_temp, + highest_humidity=highest_humidity_reading.max_humidity, + date_htemp=highest_temp_reading.date.split("-"), + date_ltemp=lowest_temp_reading.date.split("-"), + date_hhumid=highest_humidity_reading.date.split("-"), + ) + + return weather_extremes + @staticmethod def compute_average_stats(readings): """Computes the average weather statistics for a particular month of the year @@ -38,4 +60,3 @@ def compute_average_stats(readings): avg_mean_humidity = total_mean_humidity / count return avg_max_temp, avg_min_temp, avg_mean_humidity - diff --git a/code_files/weather_parser.py b/code_files/weather_parser.py new file mode 100644 index 0000000..4f818c4 --- /dev/null +++ b/code_files/weather_parser.py @@ -0,0 +1,48 @@ +import os +import csv +import zipfile +from code_files.weather_readings import WeatherReading + + +class WeatherParser: + def __init__(self, extract_to): + self.extract_to = extract_to + self.weather_readings = [] + + def extract_zip(self): + """Extracts files from a weatherfiles archive. + + Args: + extract_to (str): The path to the directory where the extracted files will be placed. + """ + with zipfile.ZipFile("weatherfiles.zip", "r") as zip_ref: + zip_ref.extractall(self.extract_to) + + def parse_weather_file(self, path): + """Parses a TXT file containing weather data. + + This method reads a TXT file at the specified path and populates the + weather_readings list of the class with WeatherReading objects. Each + object represents a day's weather data. + """ + with open(path, "r") as file: + reader = csv.DictReader(file) + for row in reader: + date = row[list(row.keys())[0]] + max_temp = row["Max TemperatureC"] + min_temp = row["Min TemperatureC"] + max_humidity = row["Max Humidity"] + mean_humidity = row[" Mean Humidity"] + + reading = WeatherReading( + date, max_temp, min_temp, max_humidity, mean_humidity + ) + self.weather_readings.append(reading) + + def parse_all_files(self): + """Parses all weather data files in the 'weatherfiles' directory.""" + + dir_path = os.path.join(self.extract_to, "weatherfiles") + for filename in os.listdir(dir_path): + file_path = os.path.join(dir_path, filename) + self.parse_weather_file(file_path) diff --git a/code_files/weather_readings.py b/code_files/weather_readings.py index f9abea6..1506fdf 100644 --- a/code_files/weather_readings.py +++ b/code_files/weather_readings.py @@ -1,10 +1,25 @@ from dataclasses import dataclass -@dataclass + class WeatherReading: - date: str - max_temp: int - min_temp: int - max_humidity: int - mean_humidity: int + def __init__(self, date, max_temp, min_temp, max_humidity, mean_humidity): + self.date = date + self.max_temp = self.validate_reading(max_temp) + self.min_temp = self.validate_reading(min_temp) + self.max_humidity = self.validate_reading(max_humidity) + self.mean_humidity = self.validate_reading(mean_humidity) + + @staticmethod + def validate_reading(value): + if value: + return int(value) + +@dataclass +class WeatherExtremes: + highest_temp: int + lowest_temp: int + highest_humidity: int + date_htemp: list + date_ltemp: list + date_hhumid: list diff --git a/code_files/weather_reporter.py b/code_files/weather_reporter.py index 147d691..de570f5 100644 --- a/code_files/weather_reporter.py +++ b/code_files/weather_reporter.py @@ -1,62 +1,45 @@ -from computations import Computations +from code_files.constants import Colors, MonthsMapping -MONTHS = { - 1: "January", - 2: "February", - 3: "March", - 4: "April", - 5: "May", - 6: "June", - 7: "July", - 8: "August", - 9: "September", - 10: "October", - 11: "November", - 12: "December", -} class WeatherReporter: @staticmethod - def generate_report_extremes(readings): + def generate_report_extremes(weather_extremes): """Generates a report summarizing weather extremes for a year.""" - h_temp, l_temp, h_humidity = Computations.compute_extreme_stats(readings) - date_htemp = h_temp.date.split("-") - date_ltemp = l_temp.date.split("-") - date_hhumid = h_humidity.date.split("-") - - print(f"\n<==== Report for the year {date_htemp[0]}: ====>") - print(f"Highest: {h_temp.max_temp}C on {MONTHS[int(date_htemp[1])]} {date_htemp[2]}") - print(f"Lowest: {l_temp.min_temp}C on {MONTHS[int(date_ltemp[1])]} {date_ltemp[2]}") - print(f"Humidity: {h_humidity.max_humidity}% on {MONTHS[int(date_hhumid[1])]} {date_hhumid[2]}") + print(f"\n<==== Report for the year {weather_extremes.date_htemp[0]}: ====>") + print( + f"Highest: {weather_extremes.highest_temp}C on " + f"{MonthsMapping.MONTHS[int(weather_extremes.date_htemp[1])]} " + f"{weather_extremes.date_htemp[2]}" + ) + print( + f"Lowest: {weather_extremes.lowest_temp}C on " + f"{MonthsMapping.MONTHS[int(weather_extremes.date_ltemp[1])]} " + f"{weather_extremes.date_ltemp[2]}" + ) + print( + f"Humidity: {weather_extremes.highest_humidity}% on " + f"{MonthsMapping.MONTHS[int(weather_extremes.date_hhumid[1])]} " + f"{weather_extremes.date_hhumid[2]}" + ) print("-------------------------------------") - def generate_report_averages(year, month, readings): + def generate_report_averages(year, month, avg_max_temp, avg_min_temp, avg_mean_humidity): """Generates a report summarizing average weather statistics for a given year and month.""" - avg_max_temp, avg_min_temp, avg_mean_humidity = Computations.compute_average_stats(readings) - - print(f"\n<==== Report for the month: {MONTHS[month]} {year} ====>") + print(f"\n<==== Report for the month: {MonthsMapping.MONTHS[month]} {year} ====>") print(f"Highest Average: {avg_max_temp:.1f}C") print(f"Lowest Average: {avg_min_temp:.1f}C") print(f"Average Mean Humidity: {avg_mean_humidity:.1f}%") print("-------------------------------------") - def generate_report_barchart(year, month, readings, isInline): + def generate_report_barchart(date, high_bar, low_bar, isInline): """Generates bar chart of daily highest and lowest temperatures for a given month of the year""" - RED = "\033[91m" - BLUE = "\033[94m" - RESET = "\033[0m" - - print(f"\n<==== Temperature Bar Charts for {MONTHS[month]} {year} ====>") - for reading in readings: - high_bar = '+' * reading.max_temp - low_bar = '+' * reading.min_temp - day = reading.date.split('-')[-1] - if isInline: - print(f"{day + BLUE} {low_bar + RED} {high_bar} {BLUE}{reading.min_temp}C{RESET + ' - ' + RED}{reading.max_temp}C{RESET}") - else: - print(f"{day + RED} {high_bar} {reading.max_temp}C{RESET}") - print(f"{day + BLUE} {low_bar} {reading.min_temp}C{RESET}") - + if isInline: + print(f"{date[-1]}{Colors.BLUE} {low_bar}{Colors.RED} {high_bar} " + f"{Colors.BLUE}{len(low_bar)}C{Colors.RESET} - " + f"{Colors.RED}{len(high_bar)}C{Colors.RESET}") + else: + print(f"{date[-1] + Colors.RED} {high_bar} {len(high_bar)}C{Colors.RESET}") + print(f"{date[-1] + Colors.BLUE} {low_bar} {len(low_bar)}C{Colors.RESET}") diff --git a/weatherman.py b/weatherman.py new file mode 100644 index 0000000..ecf9021 --- /dev/null +++ b/weatherman.py @@ -0,0 +1,61 @@ +import argparse +from code_files.weather_parser import WeatherParser +from code_files.weather_reporter import WeatherReporter +from code_files.report_calculator import ReportCalculator + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("extract_to", type=str) + parser.add_argument("-e", "--extremes", type=int) + parser.add_argument("-a", "--averages", type=str) + parser.add_argument("-c", "--chart", type=str) + parser.add_argument("--inline", action="store_true") + + args = parser.parse_args() + + parser = WeatherParser(args.extract_to) + parser.extract_zip() + parser.parse_all_files() + + if args.extremes: + yearly_readings = [ + r for r in parser.weather_readings if r.date.startswith(str(args.extremes)) + ] + if yearly_readings: + weather_extremes = ReportCalculator.compute_extreme_stats(yearly_readings) + WeatherReporter.generate_report_extremes(weather_extremes) + else: + print(f"No record found to show WEATHER EXTREMES agaisnt your input") + + if args.averages: + year, month = map(int, args.averages.split("/")) + monthly_readings = [ + r for r in parser.weather_readings if r.date.startswith(f"{year}-{month}") + ] + if monthly_readings: + avg_max_temp, avg_min_temp, avg_mean_humidity = ( + ReportCalculator.compute_average_stats(monthly_readings) + ) + WeatherReporter.generate_report_averages( + year, month, avg_max_temp, avg_min_temp, avg_mean_humidity + ) + else: + print(f"No record found to show AVERAGE STATS against your input") + + if args.chart: + year, month = map(int, args.chart.split("/")) + monthly_readings = [ + r for r in parser.weather_readings if r.date.startswith(f"{year}-{month}") + ] + + if monthly_readings: + for reading in monthly_readings: + if reading.max_temp and reading.min_temp: + high_bar = "+" * reading.max_temp + low_bar = "+" * reading.min_temp + date = reading.date.split("-") + WeatherReporter.generate_report_barchart( + date, high_bar, low_bar, args.inline + ) + else: + print(f"No record found to plot CHARTS against your input") From 599a07aa7c27c0eadb72e156ff5ab3ebabc27819 Mon Sep 17 00:00:00 2001 From: Muhammad Tayayb Tahir Qureshi Date: Mon, 24 Jun 2024 10:18:47 +0500 Subject: [PATCH 15/29] NoneType exception handled --- code_files/report_calculator.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code_files/report_calculator.py b/code_files/report_calculator.py index a05209b..c8249f3 100644 --- a/code_files/report_calculator.py +++ b/code_files/report_calculator.py @@ -50,9 +50,9 @@ def compute_average_stats(readings): avg_min_temp: Average Lowest temperature of the month avg_mean_humidity: Average mean humidity of the month """ - total_max_temp = sum(r.max_temp for r in readings) - total_min_temp = sum(r.min_temp for r in readings) - total_mean_humidity = sum(r.mean_humidity for r in readings) + total_max_temp = sum(r.max_temp for r in readings if r.max_temp) + total_min_temp = sum(r.min_temp for r in readings if r.min_temp) + total_mean_humidity = sum(r.mean_humidity for r in readings if r.mean_humidity) count = len(readings) avg_max_temp = total_max_temp / count From b1f61ff2496d9efa085df59157f39ad21df4b856 Mon Sep 17 00:00:00 2001 From: Muhammad Tayayb Tahir Qureshi Date: Mon, 24 Jun 2024 10:25:28 +0500 Subject: [PATCH 16/29] Using datetime instead of int --- weatherman.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/weatherman.py b/weatherman.py index ecf9021..3500926 100644 --- a/weatherman.py +++ b/weatherman.py @@ -1,4 +1,5 @@ import argparse +from datetime import datetime from code_files.weather_parser import WeatherParser from code_files.weather_reporter import WeatherReporter from code_files.report_calculator import ReportCalculator @@ -6,9 +7,9 @@ if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("extract_to", type=str) - parser.add_argument("-e", "--extremes", type=int) - parser.add_argument("-a", "--averages", type=str) - parser.add_argument("-c", "--chart", type=str) + parser.add_argument("-e", "--extremes", type=lambda e: datetime.strptime(e, '%Y')) + parser.add_argument("-a", "--averages", type=lambda a: datetime.strptime(a, '%Y/%m')) + parser.add_argument("-c", "--chart", type=lambda c: datetime.strptime(c, '%Y/%m')) parser.add_argument("--inline", action="store_true") args = parser.parse_args() @@ -19,7 +20,7 @@ if args.extremes: yearly_readings = [ - r for r in parser.weather_readings if r.date.startswith(str(args.extremes)) + r for r in parser.weather_readings if r.date.startswith(args.extremes.strftime('%Y')) ] if yearly_readings: weather_extremes = ReportCalculator.compute_extreme_stats(yearly_readings) @@ -28,7 +29,8 @@ print(f"No record found to show WEATHER EXTREMES agaisnt your input") if args.averages: - year, month = map(int, args.averages.split("/")) + year = args.averages.strftime('%Y') + month = int(args.averages.strftime('%m')) monthly_readings = [ r for r in parser.weather_readings if r.date.startswith(f"{year}-{month}") ] @@ -43,7 +45,9 @@ print(f"No record found to show AVERAGE STATS against your input") if args.chart: - year, month = map(int, args.chart.split("/")) + # year, month = map(int, args.chart.split("/")) + year = args.chart.strftime('%Y') + month = int(args.chart.strftime('%m')) monthly_readings = [ r for r in parser.weather_readings if r.date.startswith(f"{year}-{month}") ] From 90150ed551723c3fabc39a9b62a6234e3180bc01 Mon Sep 17 00:00:00 2001 From: Muhammad Tayayb Tahir Qureshi Date: Mon, 24 Jun 2024 10:38:57 +0500 Subject: [PATCH 17/29] Help messages --- weatherman.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/weatherman.py b/weatherman.py index 3500926..b79810d 100644 --- a/weatherman.py +++ b/weatherman.py @@ -6,11 +6,11 @@ if __name__ == "__main__": parser = argparse.ArgumentParser() - parser.add_argument("extract_to", type=str) - parser.add_argument("-e", "--extremes", type=lambda e: datetime.strptime(e, '%Y')) - parser.add_argument("-a", "--averages", type=lambda a: datetime.strptime(a, '%Y/%m')) - parser.add_argument("-c", "--chart", type=lambda c: datetime.strptime(c, '%Y/%m')) - parser.add_argument("--inline", action="store_true") + parser.add_argument("extract_to", type=str, help='Directory to extract the results to.') + parser.add_argument("-e", "--extremes", type=lambda e: datetime.strptime(e, '%Y'), help='Extreme weather stats for a year (format: YYYY).') + parser.add_argument("-a", "--averages", type=lambda a: datetime.strptime(a, '%Y/%m'), help='Year & Month for average weather stats (format: YYYY/MM)') + parser.add_argument("-c", "--chart", type=lambda c: datetime.strptime(c, '%Y/%m'), help='Year & Month for daily temperature chart (format: YYYY/MM)') + parser.add_argument("--inline", action="store_true", help="One bar chart for highest and lowest temp on each day") args = parser.parse_args() From b6d935340b0b0850b476f6ec2ed11e67d57d5fe8 Mon Sep 17 00:00:00 2001 From: Muhammad Tayayb Tahir Qureshi Date: Mon, 24 Jun 2024 10:45:15 +0500 Subject: [PATCH 18/29] Meaningful argument names --- weatherman.py | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/weatherman.py b/weatherman.py index b79810d..c4685c2 100644 --- a/weatherman.py +++ b/weatherman.py @@ -7,9 +7,9 @@ if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("extract_to", type=str, help='Directory to extract the results to.') - parser.add_argument("-e", "--extremes", type=lambda e: datetime.strptime(e, '%Y'), help='Extreme weather stats for a year (format: YYYY).') - parser.add_argument("-a", "--averages", type=lambda a: datetime.strptime(a, '%Y/%m'), help='Year & Month for average weather stats (format: YYYY/MM)') - parser.add_argument("-c", "--chart", type=lambda c: datetime.strptime(c, '%Y/%m'), help='Year & Month for daily temperature chart (format: YYYY/MM)') + parser.add_argument("-e", "--yearly_report", type=lambda e: datetime.strptime(e, '%Y'), help='Extreme weather stats for a year (format: YYYY).') + parser.add_argument("-a", "--monthly_report", type=lambda a: datetime.strptime(a, '%Y/%m'), help='Year & Month for average weather stats (format: YYYY/MM)') + parser.add_argument("-c", "--temp_chart", type=lambda c: datetime.strptime(c, '%Y/%m'), help='Year & Month for daily temperature chart (format: YYYY/MM)') parser.add_argument("--inline", action="store_true", help="One bar chart for highest and lowest temp on each day") args = parser.parse_args() @@ -18,9 +18,9 @@ parser.extract_zip() parser.parse_all_files() - if args.extremes: + if args.yearly_report: yearly_readings = [ - r for r in parser.weather_readings if r.date.startswith(args.extremes.strftime('%Y')) + r for r in parser.weather_readings if r.date.startswith(args.yearly_report.strftime('%Y')) ] if yearly_readings: weather_extremes = ReportCalculator.compute_extreme_stats(yearly_readings) @@ -28,9 +28,9 @@ else: print(f"No record found to show WEATHER EXTREMES agaisnt your input") - if args.averages: - year = args.averages.strftime('%Y') - month = int(args.averages.strftime('%m')) + if args.monthly_report: + year = args.monthly_report.strftime('%Y') + month = int(args.monthly_report.strftime('%m')) monthly_readings = [ r for r in parser.weather_readings if r.date.startswith(f"{year}-{month}") ] @@ -44,10 +44,9 @@ else: print(f"No record found to show AVERAGE STATS against your input") - if args.chart: - # year, month = map(int, args.chart.split("/")) - year = args.chart.strftime('%Y') - month = int(args.chart.strftime('%m')) + if args.temp_chart: + year = args.temp_chart.strftime('%Y') + month = int(args.temp_chart.strftime('%m')) monthly_readings = [ r for r in parser.weather_readings if r.date.startswith(f"{year}-{month}") ] From 6f2c4b5a1bdecc27fab75a9c7b9eb714a6baad70 Mon Sep 17 00:00:00 2001 From: Muhammad Tayayb Tahir Qureshi Date: Mon, 24 Jun 2024 11:20:01 +0500 Subject: [PATCH 19/29] Allowing multiple dates to be passed --- weatherman.py | 86 +++++++++++++++++++++++++++------------------------ 1 file changed, 45 insertions(+), 41 deletions(-) diff --git a/weatherman.py b/weatherman.py index c4685c2..c00c0bb 100644 --- a/weatherman.py +++ b/weatherman.py @@ -7,9 +7,9 @@ if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("extract_to", type=str, help='Directory to extract the results to.') - parser.add_argument("-e", "--yearly_report", type=lambda e: datetime.strptime(e, '%Y'), help='Extreme weather stats for a year (format: YYYY).') - parser.add_argument("-a", "--monthly_report", type=lambda a: datetime.strptime(a, '%Y/%m'), help='Year & Month for average weather stats (format: YYYY/MM)') - parser.add_argument("-c", "--temp_chart", type=lambda c: datetime.strptime(c, '%Y/%m'), help='Year & Month for daily temperature chart (format: YYYY/MM)') + parser.add_argument("-e", "--yearly_report", type=lambda e: datetime.strptime(e, '%Y'), nargs='+', help='Extreme weather stats for a year (format: YYYY).') + parser.add_argument("-a", "--monthly_report", type=lambda a: datetime.strptime(a, '%Y/%m'), nargs='+', help='Year & Month for average weather stats (format: YYYY/MM)') + parser.add_argument("-c", "--temp_chart", type=lambda c: datetime.strptime(c, '%Y/%m'), nargs='+', help='Year & Month for daily temperature chart (format: YYYY/MM)') parser.add_argument("--inline", action="store_true", help="One bar chart for highest and lowest temp on each day") args = parser.parse_args() @@ -19,46 +19,50 @@ parser.parse_all_files() if args.yearly_report: - yearly_readings = [ - r for r in parser.weather_readings if r.date.startswith(args.yearly_report.strftime('%Y')) - ] - if yearly_readings: - weather_extremes = ReportCalculator.compute_extreme_stats(yearly_readings) - WeatherReporter.generate_report_extremes(weather_extremes) - else: - print(f"No record found to show WEATHER EXTREMES agaisnt your input") + for yearly_report in args.yearly_report: + yearly_readings = [ + r for r in parser.weather_readings if r.date.startswith(yearly_report.strftime('%Y')) + ] + if yearly_readings: + weather_extremes = ReportCalculator.compute_extreme_stats(yearly_readings) + WeatherReporter.generate_report_extremes(weather_extremes) + else: + print(f"No record found to show WEATHER EXTREMES agaisnt your input") if args.monthly_report: - year = args.monthly_report.strftime('%Y') - month = int(args.monthly_report.strftime('%m')) - monthly_readings = [ - r for r in parser.weather_readings if r.date.startswith(f"{year}-{month}") - ] - if monthly_readings: - avg_max_temp, avg_min_temp, avg_mean_humidity = ( - ReportCalculator.compute_average_stats(monthly_readings) - ) - WeatherReporter.generate_report_averages( - year, month, avg_max_temp, avg_min_temp, avg_mean_humidity - ) - else: - print(f"No record found to show AVERAGE STATS against your input") + for monthly_report in args.monthly_report: + year = monthly_report.strftime('%Y') + month = int(monthly_report.strftime('%m')) + monthly_readings = [ + r for r in parser.weather_readings if r.date.startswith(f"{year}-{month}-") + ] + if monthly_readings: + avg_max_temp, avg_min_temp, avg_mean_humidity = ( + ReportCalculator.compute_average_stats(monthly_readings) + ) + WeatherReporter.generate_report_averages( + year, month, avg_max_temp, avg_min_temp, avg_mean_humidity + ) + else: + print(f"No record found to show AVERAGE STATS against your input") if args.temp_chart: - year = args.temp_chart.strftime('%Y') - month = int(args.temp_chart.strftime('%m')) - monthly_readings = [ - r for r in parser.weather_readings if r.date.startswith(f"{year}-{month}") - ] + for temp_chart in args.temp_chart: + year = temp_chart.strftime('%Y') + month = int(temp_chart.strftime('%m')) + monthly_readings = [ + r for r in parser.weather_readings if r.date.startswith(f"{year}-{month}-") + ] - if monthly_readings: - for reading in monthly_readings: - if reading.max_temp and reading.min_temp: - high_bar = "+" * reading.max_temp - low_bar = "+" * reading.min_temp - date = reading.date.split("-") - WeatherReporter.generate_report_barchart( - date, high_bar, low_bar, args.inline - ) - else: - print(f"No record found to plot CHARTS against your input") + if monthly_readings: + for reading in monthly_readings: + if reading.max_temp and reading.min_temp: + high_bar = "+" * reading.max_temp + low_bar = "+" * reading.min_temp + date = reading.date.split("-") + WeatherReporter.generate_report_barchart( + date, high_bar, low_bar, args.inline + ) + else: + print(f"No record found to plot CHARTS against your input") + print("-------------------------------------") From 4b32012e0123a6b56cffad28fac085e86fb58a6e Mon Sep 17 00:00:00 2001 From: Muhammad Tayayb Tahir Qureshi Date: Mon, 24 Jun 2024 12:39:40 +0500 Subject: [PATCH 20/29] Refactor to use OOP for ReportCalculator and WeatherReporter classes --- code_files/report_calculator.py | 43 +++++++++--------------- code_files/weather_reporter.py | 58 +++++++++++++++++++-------------- weatherman.py | 32 +++++++++--------- 3 files changed, 66 insertions(+), 67 deletions(-) diff --git a/code_files/report_calculator.py b/code_files/report_calculator.py index c8249f3..680883f 100644 --- a/code_files/report_calculator.py +++ b/code_files/report_calculator.py @@ -2,26 +2,22 @@ class ReportCalculator: - @staticmethod - def compute_extreme_stats(readings): - """Computes the extreme weather statistics for a particular year - - Args: - readings (list): The list of WeatherReading objects of the given year - - Returns: - weather_extremes (obj): Extreme weather stats of the year - """ + def __init__(self, readings): + self.readings = readings + + def compute_extreme_stats(self): + """Computes the extreme weather statistics for a particular year""" + highest_temp_reading = max( - readings, + self.readings, key=lambda r: r.max_temp if r.max_temp is not None else float("-inf"), ) lowest_temp_reading = min( - readings, + self.readings, key=lambda r: r.min_temp if r.min_temp is not None else float("inf"), ) highest_humidity_reading = max( - readings, + self.readings, key=lambda r: ( r.max_humidity if r.max_humidity is not None else float("-inf") ), @@ -38,23 +34,14 @@ def compute_extreme_stats(readings): return weather_extremes - @staticmethod - def compute_average_stats(readings): - """Computes the average weather statistics for a particular month of the year - - Args: - readings (list): The list of WeatherReading objects of the given month of the year + def compute_average_stats(self): + """Computes the average weather statistics for a particular month of the year""" - Returns: - avg_max_temp: Average Highest temperature of the month - avg_min_temp: Average Lowest temperature of the month - avg_mean_humidity: Average mean humidity of the month - """ - total_max_temp = sum(r.max_temp for r in readings if r.max_temp) - total_min_temp = sum(r.min_temp for r in readings if r.min_temp) - total_mean_humidity = sum(r.mean_humidity for r in readings if r.mean_humidity) + total_max_temp = sum(r.max_temp for r in self.readings if r.max_temp) + total_min_temp = sum(r.min_temp for r in self.readings if r.min_temp) + total_mean_humidity = sum(r.mean_humidity for r in self.readings if r.mean_humidity) - count = len(readings) + count = len(self.readings) avg_max_temp = total_max_temp / count avg_min_temp = total_min_temp / count avg_mean_humidity = total_mean_humidity / count diff --git a/code_files/weather_reporter.py b/code_files/weather_reporter.py index de570f5..8ef9060 100644 --- a/code_files/weather_reporter.py +++ b/code_files/weather_reporter.py @@ -1,45 +1,55 @@ +from datetime import datetime from code_files.constants import Colors, MonthsMapping class WeatherReporter: - @staticmethod - def generate_report_extremes(weather_extremes): + def __init__(self, weather_extremes=None, date=None, avg_max_temp=None, avg_min_temp=None, avg_mean_humidity=None, high_bar=None, low_bar=None, isInline=None): + self.weather_extremes = weather_extremes + self.date = date + self.avg_max_temp = avg_max_temp + self.avg_min_temp = avg_min_temp + self.avg_mean_humidity = avg_mean_humidity + self.high_bar = high_bar + self.low_bar = low_bar + self.isInline = isInline + + def generate_report_extremes(self): """Generates a report summarizing weather extremes for a year.""" - print(f"\n<==== Report for the year {weather_extremes.date_htemp[0]}: ====>") + print(f"\n<==== Report for the year {self.weather_extremes.date_htemp[0]}: ====>") print( - f"Highest: {weather_extremes.highest_temp}C on " - f"{MonthsMapping.MONTHS[int(weather_extremes.date_htemp[1])]} " - f"{weather_extremes.date_htemp[2]}" + f"Highest: {self.weather_extremes.highest_temp}C on " + f"{MonthsMapping.MONTHS[int(self.weather_extremes.date_htemp[1])]} " + f"{self.weather_extremes.date_htemp[2]}" ) print( - f"Lowest: {weather_extremes.lowest_temp}C on " - f"{MonthsMapping.MONTHS[int(weather_extremes.date_ltemp[1])]} " - f"{weather_extremes.date_ltemp[2]}" + f"Lowest: {self.weather_extremes.lowest_temp}C on " + f"{MonthsMapping.MONTHS[int(self.weather_extremes.date_ltemp[1])]} " + f"{self.weather_extremes.date_ltemp[2]}" ) print( - f"Humidity: {weather_extremes.highest_humidity}% on " - f"{MonthsMapping.MONTHS[int(weather_extremes.date_hhumid[1])]} " - f"{weather_extremes.date_hhumid[2]}" + f"Humidity: {self.weather_extremes.highest_humidity}% on " + f"{MonthsMapping.MONTHS[int(self.weather_extremes.date_hhumid[1])]} " + f"{self.weather_extremes.date_hhumid[2]}" ) print("-------------------------------------") - def generate_report_averages(year, month, avg_max_temp, avg_min_temp, avg_mean_humidity): + def generate_report_averages(self): """Generates a report summarizing average weather statistics for a given year and month.""" - print(f"\n<==== Report for the month: {MonthsMapping.MONTHS[month]} {year} ====>") - print(f"Highest Average: {avg_max_temp:.1f}C") - print(f"Lowest Average: {avg_min_temp:.1f}C") - print(f"Average Mean Humidity: {avg_mean_humidity:.1f}%") + print(f"\n<==== Report for the month: {MonthsMapping.MONTHS[int(self.date.strftime('%m'))]} {self.date.strftime('%Y')} ====>") + print(f"Highest Average: {self.avg_max_temp:.1f}C") + print(f"Lowest Average: {self.avg_min_temp:.1f}C") + print(f"Average Mean Humidity: {self.avg_mean_humidity:.1f}%") print("-------------------------------------") - def generate_report_barchart(date, high_bar, low_bar, isInline): + def generate_report_barchart(self): """Generates bar chart of daily highest and lowest temperatures for a given month of the year""" - if isInline: - print(f"{date[-1]}{Colors.BLUE} {low_bar}{Colors.RED} {high_bar} " - f"{Colors.BLUE}{len(low_bar)}C{Colors.RESET} - " - f"{Colors.RED}{len(high_bar)}C{Colors.RESET}") + if self.isInline: + print(f"{self.date.strftime('%d')}{Colors.BLUE} {self.low_bar}{Colors.RED} {self.high_bar} " + f"{Colors.BLUE}{len(self.low_bar)}C{Colors.RESET} - " + f"{Colors.RED}{len(self.high_bar)}C{Colors.RESET}") else: - print(f"{date[-1] + Colors.RED} {high_bar} {len(high_bar)}C{Colors.RESET}") - print(f"{date[-1] + Colors.BLUE} {low_bar} {len(low_bar)}C{Colors.RESET}") + print(f"{self.date.strftime('%d') + Colors.RED} {self.high_bar} {len(self.high_bar)}C{Colors.RESET}") + print(f"{self.date.strftime('%d') + Colors.BLUE} {self.low_bar} {len(self.low_bar)}C{Colors.RESET}") diff --git a/weatherman.py b/weatherman.py index c00c0bb..2d2a06e 100644 --- a/weatherman.py +++ b/weatherman.py @@ -24,25 +24,27 @@ r for r in parser.weather_readings if r.date.startswith(yearly_report.strftime('%Y')) ] if yearly_readings: - weather_extremes = ReportCalculator.compute_extreme_stats(yearly_readings) - WeatherReporter.generate_report_extremes(weather_extremes) + report_calculator = ReportCalculator(yearly_readings) + weather_extremes = report_calculator.compute_extreme_stats() + + weather_reporter = WeatherReporter(weather_extremes) + weather_reporter.generate_report_extremes() else: print(f"No record found to show WEATHER EXTREMES agaisnt your input") if args.monthly_report: - for monthly_report in args.monthly_report: - year = monthly_report.strftime('%Y') - month = int(monthly_report.strftime('%m')) + for date in args.monthly_report: + year = date.strftime('%Y') + month = int(date.strftime('%m')) monthly_readings = [ r for r in parser.weather_readings if r.date.startswith(f"{year}-{month}-") ] if monthly_readings: - avg_max_temp, avg_min_temp, avg_mean_humidity = ( - ReportCalculator.compute_average_stats(monthly_readings) - ) - WeatherReporter.generate_report_averages( - year, month, avg_max_temp, avg_min_temp, avg_mean_humidity - ) + report_calculator = ReportCalculator(monthly_readings) + avg_max_temp, avg_min_temp, avg_mean_humidity = report_calculator.compute_average_stats() + + weather_reporter = WeatherReporter(date=date, avg_max_temp=avg_max_temp, avg_min_temp=avg_min_temp, avg_mean_humidity=avg_mean_humidity) + weather_reporter.generate_report_averages() else: print(f"No record found to show AVERAGE STATS against your input") @@ -59,10 +61,10 @@ if reading.max_temp and reading.min_temp: high_bar = "+" * reading.max_temp low_bar = "+" * reading.min_temp - date = reading.date.split("-") - WeatherReporter.generate_report_barchart( - date, high_bar, low_bar, args.inline - ) + date = datetime.strptime(reading.date, "%Y-%m-%d") + + weather_reporter = WeatherReporter(date=date, high_bar=high_bar, low_bar=low_bar, isInline=args.inline) + weather_reporter.generate_report_barchart() else: print(f"No record found to plot CHARTS against your input") print("-------------------------------------") From 29f7b39b1326faaabd99d94138385d89417c20ab Mon Sep 17 00:00:00 2001 From: Muhammad Tayayb Tahir Qureshi Date: Mon, 24 Jun 2024 12:43:56 +0500 Subject: [PATCH 21/29] Formatting --- weatherman.py | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/weatherman.py b/weatherman.py index 2d2a06e..f59ab04 100644 --- a/weatherman.py +++ b/weatherman.py @@ -20,9 +20,8 @@ if args.yearly_report: for yearly_report in args.yearly_report: - yearly_readings = [ - r for r in parser.weather_readings if r.date.startswith(yearly_report.strftime('%Y')) - ] + yearly_readings = [r for r in parser.weather_readings if r.date.startswith(yearly_report.strftime('%Y'))] + if yearly_readings: report_calculator = ReportCalculator(yearly_readings) weather_extremes = report_calculator.compute_extreme_stats() @@ -36,9 +35,8 @@ for date in args.monthly_report: year = date.strftime('%Y') month = int(date.strftime('%m')) - monthly_readings = [ - r for r in parser.weather_readings if r.date.startswith(f"{year}-{month}-") - ] + monthly_readings = [r for r in parser.weather_readings if r.date.startswith(f"{year}-{month}-")] + if monthly_readings: report_calculator = ReportCalculator(monthly_readings) avg_max_temp, avg_min_temp, avg_mean_humidity = report_calculator.compute_average_stats() @@ -52,9 +50,7 @@ for temp_chart in args.temp_chart: year = temp_chart.strftime('%Y') month = int(temp_chart.strftime('%m')) - monthly_readings = [ - r for r in parser.weather_readings if r.date.startswith(f"{year}-{month}-") - ] + monthly_readings = [r for r in parser.weather_readings if r.date.startswith(f"{year}-{month}-")] if monthly_readings: for reading in monthly_readings: From f57eab6f6a8ba30a7475b5d0b20393fe77ce22a2 Mon Sep 17 00:00:00 2001 From: Muhammad Tayayb Tahir Qureshi Date: Mon, 24 Jun 2024 16:58:28 +0500 Subject: [PATCH 22/29] complying with pep8 import order --- code_files/weather_parser.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code_files/weather_parser.py b/code_files/weather_parser.py index 4f818c4..12a3443 100644 --- a/code_files/weather_parser.py +++ b/code_files/weather_parser.py @@ -1,6 +1,7 @@ -import os import csv +import os import zipfile + from code_files.weather_readings import WeatherReading From bf1e860d1d70e5d2024b30b6b83a31596f30d83e Mon Sep 17 00:00:00 2001 From: Muhammad Tayayb Tahir Qureshi Date: Mon, 24 Jun 2024 17:02:13 +0500 Subject: [PATCH 23/29] fix argparse error --- weatherman.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/weatherman.py b/weatherman.py index f59ab04..5ba4a57 100644 --- a/weatherman.py +++ b/weatherman.py @@ -7,9 +7,9 @@ if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("extract_to", type=str, help='Directory to extract the results to.') - parser.add_argument("-e", "--yearly_report", type=lambda e: datetime.strptime(e, '%Y'), nargs='+', help='Extreme weather stats for a year (format: YYYY).') - parser.add_argument("-a", "--monthly_report", type=lambda a: datetime.strptime(a, '%Y/%m'), nargs='+', help='Year & Month for average weather stats (format: YYYY/MM)') - parser.add_argument("-c", "--temp_chart", type=lambda c: datetime.strptime(c, '%Y/%m'), nargs='+', help='Year & Month for daily temperature chart (format: YYYY/MM)') + parser.add_argument("-e", "--yearly_report", type=lambda e: datetime.strptime(e, '%Y'), nargs='*', help='Extreme weather stats for a year (format: YYYY).') + parser.add_argument("-a", "--monthly_report", type=lambda a: datetime.strptime(a, '%Y/%m'), nargs='*', help='Year & Month for average weather stats (format: YYYY/MM)') + parser.add_argument("-c", "--temp_chart", type=lambda c: datetime.strptime(c, '%Y/%m'), nargs='*', help='Year & Month for daily temperature chart (format: YYYY/MM)') parser.add_argument("--inline", action="store_true", help="One bar chart for highest and lowest temp on each day") args = parser.parse_args() @@ -21,7 +21,7 @@ if args.yearly_report: for yearly_report in args.yearly_report: yearly_readings = [r for r in parser.weather_readings if r.date.startswith(yearly_report.strftime('%Y'))] - + if yearly_readings: report_calculator = ReportCalculator(yearly_readings) weather_extremes = report_calculator.compute_extreme_stats() From f6bfc70bc9fd2f971492129b2c4575b8f0862a71 Mon Sep 17 00:00:00 2001 From: Muhammad Tayayb Tahir Qureshi Date: Mon, 24 Jun 2024 17:19:53 +0500 Subject: [PATCH 24/29] Refactored to reduce redundancy by instantiating ReportCalculator and WeatherReporter once. --- code_files/report_calculator.py | 2 +- weatherman.py | 19 ++++++++++++++----- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/code_files/report_calculator.py b/code_files/report_calculator.py index 680883f..7405448 100644 --- a/code_files/report_calculator.py +++ b/code_files/report_calculator.py @@ -2,7 +2,7 @@ class ReportCalculator: - def __init__(self, readings): + def __init__(self, readings=None): self.readings = readings def compute_extreme_stats(self): diff --git a/weatherman.py b/weatherman.py index 5ba4a57..9244713 100644 --- a/weatherman.py +++ b/weatherman.py @@ -18,15 +18,18 @@ parser.extract_zip() parser.parse_all_files() + report_calculator = ReportCalculator() + weather_reporter = WeatherReporter() + if args.yearly_report: for yearly_report in args.yearly_report: yearly_readings = [r for r in parser.weather_readings if r.date.startswith(yearly_report.strftime('%Y'))] if yearly_readings: - report_calculator = ReportCalculator(yearly_readings) + report_calculator.readings = yearly_readings weather_extremes = report_calculator.compute_extreme_stats() - weather_reporter = WeatherReporter(weather_extremes) + weather_reporter.weather_extremes = weather_extremes weather_reporter.generate_report_extremes() else: print(f"No record found to show WEATHER EXTREMES agaisnt your input") @@ -38,10 +41,13 @@ monthly_readings = [r for r in parser.weather_readings if r.date.startswith(f"{year}-{month}-")] if monthly_readings: - report_calculator = ReportCalculator(monthly_readings) + report_calculator.readings = monthly_readings avg_max_temp, avg_min_temp, avg_mean_humidity = report_calculator.compute_average_stats() - weather_reporter = WeatherReporter(date=date, avg_max_temp=avg_max_temp, avg_min_temp=avg_min_temp, avg_mean_humidity=avg_mean_humidity) + weather_reporter.date = date + weather_reporter.avg_max_temp = avg_max_temp + weather_reporter.avg_min_temp = avg_min_temp + weather_reporter.avg_mean_humidity = avg_mean_humidity weather_reporter.generate_report_averages() else: print(f"No record found to show AVERAGE STATS against your input") @@ -59,7 +65,10 @@ low_bar = "+" * reading.min_temp date = datetime.strptime(reading.date, "%Y-%m-%d") - weather_reporter = WeatherReporter(date=date, high_bar=high_bar, low_bar=low_bar, isInline=args.inline) + weather_reporter.date = date + weather_reporter.high_bar = high_bar + weather_reporter.low_bar = low_bar + weather_reporter.isInline = args.inline weather_reporter.generate_report_barchart() else: print(f"No record found to plot CHARTS against your input") From a0136e7c251e83b0f6786bc5996a7b2e4a530ca5 Mon Sep 17 00:00:00 2001 From: Muhammad Tayayb Tahir Qureshi Date: Tue, 25 Jun 2024 15:05:59 +0500 Subject: [PATCH 25/29] perf: Add __eq__() method This method checks for the equality of two objects of type WeatherReading --- code_files/weather_readings.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/code_files/weather_readings.py b/code_files/weather_readings.py index 1506fdf..4bb64c9 100644 --- a/code_files/weather_readings.py +++ b/code_files/weather_readings.py @@ -8,10 +8,17 @@ def __init__(self, date, max_temp, min_temp, max_humidity, mean_humidity): self.min_temp = self.validate_reading(min_temp) self.max_humidity = self.validate_reading(max_humidity) self.mean_humidity = self.validate_reading(mean_humidity) + + def __eq__(self, other): + return self.date == other.date and \ + self.max_temp == other.max_temp and \ + self.min_temp == other.min_temp and \ + self.max_humidity == other.max_humidity and \ + self.mean_humidity == other.mean_humidity @staticmethod def validate_reading(value): - if value: + if value is not None: return int(value) From a335bc95e03014e1e31f8981aa1f9c9150126698 Mon Sep 17 00:00:00 2001 From: Muhammad Tayayb Tahir Qureshi Date: Tue, 25 Jun 2024 15:26:53 +0500 Subject: [PATCH 26/29] fix: validate_reading(value) in WeatherReading The older condition 'value is not None' isn't sufficient. The value can be empty (string) as well, in that case this method should not return anything. Other catch was 0 values. Therefore, first condition 'if value' filters out None and empty stirngs and the subsequent condition 'value == 0' lets 0's to pass the condition since they are desired. --- code_files/weather_readings.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code_files/weather_readings.py b/code_files/weather_readings.py index 4bb64c9..f4f59d0 100644 --- a/code_files/weather_readings.py +++ b/code_files/weather_readings.py @@ -18,8 +18,10 @@ def __eq__(self, other): @staticmethod def validate_reading(value): - if value is not None: + if value: # if value is empty '' return int(value) + elif value == 0: # if value is 0 + return value @dataclass From d424b15732b0c6abe00979ea38b6d8fc1cb3cf0a Mon Sep 17 00:00:00 2001 From: Muhammad Tayayb Tahir Qureshi Date: Tue, 25 Jun 2024 15:15:34 +0500 Subject: [PATCH 27/29] Update .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index dfdf365..ee730d8 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ rough/ weatherfiles/ weatherfiles.zip FileTree.ini +.vscode/ \ No newline at end of file From 06bb4200a3ac9d9b989fcba2e8db7906859a66be Mon Sep 17 00:00:00 2001 From: Muhammad Tayayb Tahir Qureshi Date: Tue, 25 Jun 2024 15:22:55 +0500 Subject: [PATCH 28/29] minor change: Set the default value of extract_to to None --- code_files/weather_parser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code_files/weather_parser.py b/code_files/weather_parser.py index 12a3443..8466315 100644 --- a/code_files/weather_parser.py +++ b/code_files/weather_parser.py @@ -6,7 +6,7 @@ class WeatherParser: - def __init__(self, extract_to): + def __init__(self, extract_to=None): self.extract_to = extract_to self.weather_readings = [] From e64384181eb43ecc9516ef2cbd86171d52025b51 Mon Sep 17 00:00:00 2001 From: Muhammad Tayayb Tahir Qureshi Date: Tue, 25 Jun 2024 16:27:01 +0500 Subject: [PATCH 29/29] Organizing imports --- code_files/weather_app.py | 5 +++++ weatherman.py | 11 +++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) create mode 100644 code_files/weather_app.py diff --git a/code_files/weather_app.py b/code_files/weather_app.py new file mode 100644 index 0000000..3973b04 --- /dev/null +++ b/code_files/weather_app.py @@ -0,0 +1,5 @@ +from code_files.weather_parser import WeatherParser +from code_files.weather_reporter import WeatherReporter +from code_files.report_calculator import ReportCalculator + +__all__ = ['WeatherParser', 'WeatherReporter', 'ReportCalculator'] \ No newline at end of file diff --git a/weatherman.py b/weatherman.py index 9244713..5307f9a 100644 --- a/weatherman.py +++ b/weatherman.py @@ -1,10 +1,9 @@ import argparse from datetime import datetime -from code_files.weather_parser import WeatherParser -from code_files.weather_reporter import WeatherReporter -from code_files.report_calculator import ReportCalculator -if __name__ == "__main__": +from code_files.weather_app import WeatherParser, WeatherReporter, ReportCalculator + +def main(): parser = argparse.ArgumentParser() parser.add_argument("extract_to", type=str, help='Directory to extract the results to.') parser.add_argument("-e", "--yearly_report", type=lambda e: datetime.strptime(e, '%Y'), nargs='*', help='Extreme weather stats for a year (format: YYYY).') @@ -73,3 +72,7 @@ else: print(f"No record found to plot CHARTS against your input") print("-------------------------------------") + + +if __name__ == "__main__": + main() \ No newline at end of file