Samuel Sloniker
1 year ago
2 changed files with 93 additions and 0 deletions
@ -0,0 +1,91 @@
|
||||
import csv |
||||
import sys |
||||
import dataclasses |
||||
import thefuzz.fuzz, thefuzz.process |
||||
import typing |
||||
import itertools |
||||
|
||||
|
||||
@dataclasses.dataclass |
||||
class Park: |
||||
reference: str |
||||
name: str |
||||
location: typing.List[str] |
||||
latitude: float |
||||
longitude: float |
||||
grid: str |
||||
attempts: int |
||||
activations: int |
||||
qsos: int |
||||
|
||||
|
||||
@dataclasses.dataclass |
||||
class ParkDatabase: |
||||
parks: typing.List[Park] |
||||
|
||||
def __post_init__(self): |
||||
self.parks_dict = {park.reference: park for park in self.parks} |
||||
|
||||
def search_name(self, string): |
||||
return [ |
||||
self.parks_dict[i[0].split("|")[0]] |
||||
for i in thefuzz.process.extract( |
||||
string, |
||||
[park.reference + "|" + park.name for park in self.parks], |
||||
scorer=thefuzz.fuzz.partial_ratio, |
||||
) |
||||
] |
||||
|
||||
def filter_location(self, location): |
||||
location = location.upper() |
||||
return ParkDatabase( |
||||
[ |
||||
park |
||||
for park in self.parks |
||||
if (location in park.location) |
||||
or ( |
||||
location |
||||
in [ |
||||
park_location.split("-")[0] |
||||
for park_location in park.location |
||||
] |
||||
) |
||||
] |
||||
) |
||||
|
||||
def get_locations(self): |
||||
return _uniq(itertools.chain(*[park.location for park in self.parks])) |
||||
|
||||
def get_expanded_locations(self): |
||||
return _uniq(_expand_locations(self.get_locations())) |
||||
|
||||
|
||||
def _uniq(data): |
||||
return sorted(set(data)) |
||||
|
||||
|
||||
def _expand_location(code): |
||||
return code, code.split("-")[0] |
||||
|
||||
|
||||
def _expand_locations(codes): |
||||
return itertools.chain(*[_expand_location(code) for code in codes]) |
||||
|
||||
|
||||
def load_csv(f): |
||||
return ParkDatabase( |
||||
[ |
||||
Park( |
||||
park["reference"], |
||||
park["name"], |
||||
park["locationDesc"].split(","), |
||||
float(park["latitude"]), |
||||
float(park["longitude"]), |
||||
park["grid"], |
||||
int(park["attempts"]), |
||||
int(park["activations"]), |
||||
int(park["qsos"]), |
||||
) |
||||
for park in csv.DictReader(f) |
||||
] |
||||
) |
Loading…
Reference in new issue