aboutsummaryrefslogtreecommitdiffstats
path: root/main.py
diff options
context:
space:
mode:
Diffstat (limited to 'main.py')
-rw-r--r--main.py91
1 files changed, 91 insertions, 0 deletions
diff --git a/main.py b/main.py
new file mode 100644
index 0000000..5c9b0cb
--- /dev/null
+++ b/main.py
@@ -0,0 +1,91 @@
+import argparse
+import sys
+from io import StringIO
+from textwrap import dedent
+
+import pandas as pd
+import requests
+from colorama import Back, Fore, Style, just_fix_windows_console
+from geopy.distance import geodesic
+from geopy.geocoders import Nominatim
+
+just_fix_windows_console()
+
+
+ENDPOINT = "https://www.fuel-finder.service.gov.uk/internal/v1.0.2/csv/get-latest-fuel-prices-csv"
+near_stations = []
+
+
+def get_location(address):
+ loc = Nominatim(user_agent="FuelNearMe")
+ getLoc = loc.geocode(address)
+ if not getLoc:
+ print("[*] Failed to get location. Please check if the address is valid.")
+ sys.exit(1)
+ latitude = getLoc.latitude
+ longitude = getLoc.longitude
+ return (latitude, longitude)
+
+
+def get_latest_data():
+ response = requests.get(ENDPOINT)
+ return pd.read_csv(StringIO(response.text)), response.headers.get("Last-Modified")
+
+
+parser = argparse.ArgumentParser()
+parser.add_argument("-a", "--address", type=str, required=True)
+parser.add_argument("-r", "--radius", type=int, default=5)
+parser.add_argument("-s", "--sort", type=str, default="e10")
+args = parser.parse_args()
+
+location = get_location(args.address)
+
+df, last_modified = get_latest_data()
+
+print(f"Last modified: {last_modified}")
+
+price_cols = [c for c in df.columns if "fuel_price" in c]
+df[price_cols] = df[price_cols].fillna(0.0)
+df = df.fillna("N/A")
+
+print(f"\n{Fore.MAGENTA}Stations: " + Style.RESET_ALL + str(len(df)))
+
+for station, latitude, longitude, e5_price, e10_price, diesel_price in zip(
+ df["forecourts.trading_name"],
+ df["forecourts.location.latitude"],
+ df["forecourts.location.longitude"],
+ df["forecourts.fuel_price.E5"],
+ df["forecourts.fuel_price.E10"],
+ df["forecourts.fuel_price.B7S"],
+):
+ distance_from_current_location = geodesic((latitude, longitude), location).miles
+ if distance_from_current_location < args.radius:
+ station_dict = {
+ "station_name": station,
+ "distance": round(distance_from_current_location, 1),
+ "e5_price": round(e5_price / 100, 2),
+ "e10_price": round(e10_price / 100, 2),
+ "diesel_price": round(diesel_price / 100, 2),
+ }
+ near_stations.append(station_dict)
+
+match args.sort:
+ case "e10":
+ sort_by = "e10_price"
+ case "e5":
+ sort_by = "e5_price"
+ case "b7s":
+ sort_by = "diesel_price"
+ case "distance":
+ sort_by = "distance"
+
+near_stations_sorted_by_price = sorted(near_stations, key=lambda d: d[sort_by])
+
+for number, row in enumerate(near_stations_sorted_by_price):
+ output = dedent(f"""
+ {number + 1}. {row["station_name"]}
+ Distance: {row["distance"]} miles
+ E5 Price: £{row["e5_price"]:.2f}/L
+ E10 Price: £{row["e10_price"]:.2f}/L
+ B7S (Standard Diesel) Price: £{row["diesel_price"]:.2f}/L""")
+ print(output)
git.ajschof.me — hosted by ajschofield — powered by cgit