Justin Grave
Justin Grave

Reputation: 41

How to find the closest number in CSV file that is the closest to a user input?

I'm still new to Python. I want to make a Car loan calculator that only runs in command prompt. The Calculator needs to take input from the users. I managed to get the input of the users and print the list of prices in the CSV file. I need to find the closest price in the CSV file that is closest to my variable vehiclecost. Is there any code I can use to do that?

Code:

carlist = open("carlist.csv")
data = carlist.readline()

print("Vehicle cost:")
vehiclecost = float(input().strip("! .? % $"))

print("Annual interest rate:")
AnnualInterestRate = float(input().strip("! .? % $"))

print("Loan duration:")
loandur = int(input().strip("! .? % $"))
while loandur > 10:
    print("Try again your loan duration is too long!")
    loandur = float(input().strip("! .? % $"))

loanmonth = (loandur * 12)
carwithtax = (vehiclecost * 0.12 + vehiclecost)
InterestRate = AnnualInterestRate / (100 * 12)
monthlypayment = carwithtax * (InterestRate *
                               ((InterestRate + 1)**loanmonth)) / ((InterestRate + 1)**loanmonth - 1)

print("Your loan amount would be: " + str(carwithtax))
print("Your monthly payment would be: {:.2f}".format(monthlypayment))

for x in range(1, loandur + 1):
    for y in range(12):
        monthlyinterest = (carwithtax * InterestRate)
        principal = (monthlypayment - monthlyinterest)
        carwithtax = float(carwithtax - principal)
    print("Years:", x)
    print("Bal remaining: {:.2f}".format(carwithtax))
    month = x * 12
print("Total payemtns, {:.2f}".format(month * monthlypayment))

print("Car Recomendation")

for data in carlist:
    price = data.split(",")
    if int(price[0]) < vehiclecost:
        lower = data.split(",")
    print(lower)

My input file: Carlist.csv

Upvotes: 1

Views: 287

Answers (1)

fnet
fnet

Reputation: 338

Snippet

To find the closest value vehicle from the data set:

# get the price list from the csv
price_list = [row[0] for row in car_list]

# get the closest value vehicle
closest_value_vehicle = min(price_list, key=lambda x:abs(int(x)-vehicle_cost))

Full Code

I cleaned up the code a little and added commenting.

Tested with the supplied dataset.

import csv

with open('carlist.csv', 'r') as csv_file:
    reader = csv.reader(csv_file, delimiter=',')
    # skip header
    next(reader, None)
    # assign car list
    car_list = list(reader)

while True:
    try:
        # vehicle cost
        vehicle_cost = float(input("Please enter the vehicle cost:").strip("! .? % $"))
    except ValueError:
        print("Invalid input. Vehicle cost must be numeric.")
        continue
    else:
        break

while True:
    try:
        # annual interest rate
        annual_interest_rate = float(input("Please enter the annual interest rate:").strip("! .? % $"))
    except ValueError:
        print("Invalid input. Annual interest rate must be numeric.")
        continue
    else:
        break

while True:
    try:
        # loan duration
        loan_duration = int(input("Please enter the loan duration:").strip("! .? % $"))
    except ValueError:
        print("Invalid input. Loan duration must be numeric.")
        continue
    if loan_duration > 10:
        print("Invalid input. Loan duration must be less than 10.")
        continue
    else:
        break

# total loan months
loan_total_months = loan_duration * 12

# vehicle tax
vehicle_tax = vehicle_cost * 0.12 + vehicle_cost

# interest rate
interest_rate = annual_interest_rate / ( 100 * 12 )

# monthly repayment
monthly_repayment = vehicle_tax * ( interest_rate * ( ( interest_rate + 1 ) ** loan_total_months ) ) / ( ( interest_rate + 1 ) ** loan_total_months - 1 )


print("Your loan amount would be: $%s" % str('{:,}'.format(vehicle_tax)) )
print("Your monthly payment would be: {:.2f}".format(monthly_repayment) )

# repayments
for x in range(1, loan_duration + 1):
    for y in range(12):
        monthly_interest = (vehicle_tax * interest_rate) 
        principal = (monthly_repayment - monthly_interest)
        vehicle_tax = float(vehicle_tax - principal)
    print("Years:", x)
    print("Balance remaining: ${:.2f}".format(vehicle_tax))
    month = x * 12
    print("Total payments: ${:.2f}".format(month*monthly_repayment))



# vehicles in price range
vehicles_in_price_range = []

# get the price list from the csv
price_list = [row[0] for row in car_list]

# get the closest value vehicle
closest_value_vehicle = min(price_list, key=lambda x:abs(int(x)-vehicle_cost))

print(closest_value_vehicle)

for row in car_list:
    # price
    price = row[0]
    # check if price in range
    if int(price) == int(closest_value_vehicle):
        vehicles_in_price_range.append(row)

print("Vehicle Recomendations:")

# print list of vehicles in price range
for vehicle in vehicles_in_price_range:

    print('%s %s %s (VIN: %s) (Millage:%s) (Location: %s, %s) - $%s' % 
        ( vehicle[1], 
          vehicle[6], 
          vehicle[7], 
          vehicle[5], 
          vehicle[2], 
          vehicle[3], 
          vehicle[4], 
          str('{:,}'.format(int(vehicle[0]))) ) )

Upvotes: 1

Related Questions