|
|
from typing import Union, Tuple |
|
|
import datetime |
|
|
|
|
|
class NextPlaceBaseModel: |
|
|
|
|
|
|
|
|
def __init__(self): |
|
|
self._load_model() |
|
|
|
|
|
|
|
|
def _load_model(self): |
|
|
""" |
|
|
Perform any actions needed to load the model. |
|
|
EX: Establish API connections, download an ML model for inference, etc... |
|
|
""" |
|
|
print("Loading model...") |
|
|
|
|
|
print("Model loaded.") |
|
|
|
|
|
|
|
|
def _sale_date_predictor(self, daysOnMarket: int): |
|
|
""" |
|
|
Calculate the expected sale date based on the national average |
|
|
:param daysOnMarket: number of days this house has been on the market |
|
|
:return: the predicted sale date, based on the national average of 34 days |
|
|
""" |
|
|
national_average = 34 |
|
|
if daysOnMarket < national_average: |
|
|
days_until_sale = national_average - daysOnMarket |
|
|
sale_date = datetime.date.today() + datetime.timedelta(days=days_until_sale) |
|
|
return sale_date |
|
|
else: |
|
|
return datetime.date.today() + datetime.timedelta(days=1) |
|
|
|
|
|
|
|
|
def run_inference(self, input_data: dict[str, Union[str, int, float]]) -> Tuple[float, str]: |
|
|
""" |
|
|
Predict the sale price and sale date for the house represented by `input_data` |
|
|
:param input_data: a formatted Synapse from the validator, representing a currently listed house |
|
|
:return: the predicted sale price and predicted sale date for this home |
|
|
""" |
|
|
predicted_sale_price = float(input_data['price']) if ('price' in input_data) else 1.0 |
|
|
predicted_sale_date = self._sale_date_predictor(input_data['dom']) if ('dom' in input_data) else datetime.date.today() + datetime.timedelta(days=1) |
|
|
predicted_sale_date = predicted_sale_date.strftime("%Y-%m-%d") |
|
|
print(f"Predicted sale price: {predicted_sale_price}") |
|
|
print(f"Predicted sale date: {predicted_sale_date}") |
|
|
return predicted_sale_price, predicted_sale_date |
|
|
|
|
|
|