Spaces:
Running
Running
from tools.accommodations.apis import Accommodations | |
from tools.flights.apis import Flights | |
from tools.restaurants.apis import Restaurants | |
from tools.rank.apis import Rank | |
from tools.filter.apis import Filter | |
from tools.googleDistanceMatrix.apis import GoogleDistanceMatrix | |
import pandas as pd | |
hotel = Accommodations() | |
flight = Flights() | |
flight.load_db() | |
restaurant = Restaurants() | |
rank = Rank() | |
filter = Filter() | |
distanceMatrix = GoogleDistanceMatrix() | |
def estimate_budget(data, mode): | |
""" | |
Estimate the budget based on the mode (lowest, highest, average) for flight, hotel, or restaurant data. | |
""" | |
if mode == "lowest": | |
return min(data) | |
elif mode == "highest": | |
return max(data) | |
elif mode == "average": | |
# filter the nan values | |
data = [x for x in data if str(x) != 'nan'] | |
return sum(data) / len(data) | |
def budget_calc(org, dest, days, date:list , people_number=None, local_constraint = None): | |
""" | |
Calculate the estimated budget for all three modes: lowest, highest, average. | |
grain: city, state | |
""" | |
if days == 3: | |
grain = "city" | |
elif days in [5,7]: | |
grain = "state" | |
if grain not in ["city", "state"]: | |
raise ValueError("grain must be one of city, state") | |
# Multipliers based on days | |
multipliers = { | |
3: {"flight": 2, "hotel": 3, "restaurant": 9}, | |
5: {"flight": 3, "hotel": 5, "restaurant": 15}, | |
7: {"flight": 4, "hotel": 7, "restaurant": 21} | |
} | |
if grain == "city": | |
hotel_data = hotel.run(dest) | |
restaurant_data = restaurant.run(dest) | |
flight_data = flight.data[(flight.data["DestCityName"] == dest) & (flight.data["OriginCityName"] == org)] | |
elif grain == "state": | |
city_set = open('/home/user/app/database/background/citySet_with_states.txt').read().strip().split('\n') | |
all_hotel_data = [] | |
all_restaurant_data = [] | |
all_flight_data = [] | |
for city in city_set: | |
if dest == city.split('\t')[1]: | |
candidate_city = city.split('\t')[0] | |
# Fetch data for the current city | |
current_hotel_data = hotel.run(candidate_city) | |
current_restaurant_data = restaurant.run(candidate_city) | |
current_flight_data = flight.data[(flight.data["DestCityName"] == candidate_city) & (flight.data["OriginCityName"] == org)] | |
# Append the dataframes to the lists | |
all_hotel_data.append(current_hotel_data) | |
all_restaurant_data.append(current_restaurant_data) | |
all_flight_data.append(current_flight_data) | |
# Use concat to combine all dataframes in the lists | |
hotel_data = pd.concat(all_hotel_data, axis=0) | |
restaurant_data = pd.concat(all_restaurant_data, axis=0) | |
flight_data = pd.concat(all_flight_data, axis=0) | |
# flight_data should be in the range of supported date | |
flight_data = flight_data[flight_data['FlightDate'].isin(date)] | |
if people_number: | |
hotel_data = hotel_data[hotel_data['maximum occupancy'] >= people_number] | |
if local_constraint: | |
if local_constraint['transportation'] == 'no self-driving': | |
if grain == "city": | |
if len(flight_data[flight_data['FlightDate'] == date[0]]) < 2: | |
raise ValueError("No flight data available for the given constraints.") | |
elif grain == "state": | |
if len(flight_data[flight_data['FlightDate'] == date[0]]) < 10: | |
raise ValueError("No flight data available for the given constraints.") | |
elif local_constraint['transportation'] == 'no flight': | |
if len(flight_data[flight_data['FlightDate'] == date[0]]) < 2 or flight_data.iloc[0]['Distance'] > 800: | |
raise ValueError("Impossible") | |
# if local_constraint['flgiht time']: | |
# if local_constraint['flgiht time'] == 'morning': | |
# flight_data = flight_data[flight_data['DepTime'] < '12:00'] | |
# elif local_constraint['flgiht time'] == 'afternoon': | |
# flight_data = flight_data[(flight_data['DepTime'] >= '12:00') & (flight_data['DepTime'] < '18:00')] | |
# elif local_constraint['flgiht time'] == 'evening': | |
# flight_data = flight_data[flight_data['DepTime'] >= '18:00'] | |
if local_constraint['room type']: | |
if local_constraint['room type'] == 'shared room': | |
hotel_data = hotel_data[hotel_data['room type'] == 'Shared room'] | |
elif local_constraint['room type'] == 'not shared room': | |
hotel_data = hotel_data[(hotel_data['room type'] == 'Private room') | (hotel_data['room type'] == 'Entire home/apt')] | |
elif local_constraint['room type'] == 'private room': | |
hotel_data = hotel_data[hotel_data['room type'] == 'Private room'] | |
elif local_constraint['room type'] == 'entire room': | |
hotel_data = hotel_data[hotel_data['room type'] == 'Entire home/apt'] | |
if days == 3: | |
if len(hotel_data) < 3: | |
raise ValueError("No hotel data available for the given constraints.") | |
elif days == 5: | |
if len(hotel_data) < 5: | |
raise ValueError("No hotel data available for the given constraints.") | |
elif days == 7: | |
if len(hotel_data) < 7: | |
raise ValueError("No hotel data available for the given constraints.") | |
if local_constraint['house rule']: | |
if local_constraint['house rule'] == 'parties': | |
# the house rule should not contain 'parties' | |
hotel_data = hotel_data[~hotel_data['house_rules'].str.contains('No parties')] | |
elif local_constraint['house rule'] == 'smoking': | |
hotel_data = hotel_data[~hotel_data['house_rules'].str.contains('No smoking')] | |
elif local_constraint['house rule'] == 'children under 10': | |
hotel_data = hotel_data[~hotel_data['house_rules'].str.contains('No children under 10')] | |
elif local_constraint['house rule'] == 'pets': | |
hotel_data = hotel_data[~hotel_data['house_rules'].str.contains('No pets')] | |
elif local_constraint['house rule'] == 'visitors': | |
hotel_data = hotel_data[~hotel_data['house_rules'].str.contains('No visitors')] | |
if days == 3: | |
if len(hotel_data) < 3: | |
raise ValueError("No hotel data available for the given constraints.") | |
elif days == 5: | |
if len(hotel_data) < 5: | |
raise ValueError("No hotel data available for the given constraints.") | |
elif days == 7: | |
if len(hotel_data) < 7: | |
raise ValueError("No hotel data available for the given constraints.") | |
if local_constraint['cuisine']: | |
# judge whether the cuisine is in the cuisine list | |
restaurant_data = restaurant_data[restaurant_data['Cuisines'].str.contains('|'.join(local_constraint['cuisine']))] | |
if days == 3: | |
if len(restaurant_data) < 3: | |
raise ValueError("No restaurant data available for the given constraints.") | |
elif days == 5: | |
if len(restaurant_data) < 5: | |
raise ValueError("No restaurant data available for the given constraints.") | |
elif days == 7: | |
if len(restaurant_data) < 7: | |
raise ValueError("No restaurant data available for the given constraints.") | |
# hotel_data = filter.run(hotel_data, local_constraint) | |
# restaurant_data = filter.run(restaurant_data, local_constraint) | |
# flight_data = filter.run(flight_data, local_constraint) | |
# Calculate budgets for all three modes | |
budgets = {} | |
for mode in ["lowest", "highest", "average"]: | |
if local_constraint and local_constraint['transportation'] == 'self driving': | |
flight_budget = eval(distanceMatrix.run(org, dest)['cost'].replace("$","")) * multipliers[days]["flight"] | |
else: | |
flight_budget = estimate_budget(flight_data["Price"].tolist(), mode) * multipliers[days]["flight"] | |
hotel_budget = estimate_budget(hotel_data["price"].tolist(), mode) * multipliers[days]["hotel"] | |
restaurant_budget = estimate_budget(restaurant_data["Average Cost"].tolist(), mode) * multipliers[days]["restaurant"] | |
total_budget = flight_budget + hotel_budget + restaurant_budget | |
budgets[mode] = total_budget | |
return budgets | |