Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from enum import Enum
- import datetime
- import random
- import pandas as pd
- class KindOfTrip(Enum):
- IN_CITY = 1
- OUTSIDE_CITY = 2
- class Trip(object):
- def __init__(self, date, number, brand, speedometer, kind_of_trip):
- self.date = date
- self.number = number
- self.brand = brand
- self.speedometer = speedometer
- self.kind_of_trip = kind_of_trip
- def __lt__(self, other):
- return (self.number, self.date) < (other.number, other.date)
- def __sub__(self, other):
- if self.number == other.number:
- return self.speedometer - other.speedometer
- else:
- raise ValueError("Different numbers")
- def __str__(self):
- return "Trip : date-" + str(self.date) + ", number-" + \
- self.number + ", brand -" +self.brand + \
- ", speedometer: " + str(self.speedometer) + \
- ", kind of trip - " + str(self.kind_of_trip)
- def to_dict(self):
- return {
- "date": self.date,
- "number": self.number,
- "brand": self.brand,
- "speedometer": self.speedometer,
- "kind": self.kind_of_trip
- }
- class T_char(object):
- def __init__(self, incity_mileage, outside_mileage, tech_check_distance):
- self.incity_mileage = incity_mileage
- self.outside_mileage = outside_mileage
- self.tech_check_distance = tech_check_distance
- def to_dict(self):
- return {
- "incity": self.incity_mileage,
- "outside": self.outside_mileage,
- "tech_check": self.tech_check_distance
- }
- char = {
- "Nissan": T_char(12, 10, 2000),
- "Suzuki": T_char(10, 8, 1000),
- "Mazda": T_char(15, 10, 5000 )
- }
- def parse(line):
- datestr, number, model, speedometer_str, kind_str = line.split()
- dt = datetime.datetime.strptime(datestr, "%d.%m.%Y")
- speedometer = int(speedometer_str)
- kind = None
- if kind_str == "incity":
- kind = KindOfTrip.IN_CITY
- else:
- kind = KindOfTrip.OUTSIDE_CITY
- return Trip(dt, number, model, speedometer, kind)
- def calculate_for_car(number, trips):
- car_trips = []
- for trip in trips:
- if trip.number == number:
- car_trips.append(trip)
- car_trips = sorted(car_trips)
- if len(car_trips) == 0:
- raise ValueError("Car not present")
- car_char = char[car_trips[0].brand]
- milein = car_char.incity_mileage
- mileout = car_char.outside_mileage
- tech_check = car_char.tech_check_distance
- mileage = 0
- fuel = 0
- for i in range(1, len(car_trips)):
- lentrip = car_trips[i] - car_trips[i-1]
- mileage += lentrip
- if car_trips[i].kind_of_trip == KindOfTrip.IN_CITY:
- fuel += milein*lentrip
- else:
- fuel += mileout*lentrip
- should_check = (car_trips[-1].speedometer%tech_check) >= 0.95 * tech_check
- return fuel, mileage, should_check
- def get_cars_for_check(cars, trips):
- result = []
- for car in cars:
- _, _, should_check = calculate_for_car(car, trips)
- if should_check:
- result.append(car)
- return result
- if __name__ == "__main__":
- f = open("journal.txt", "r")
- trips = []
- for line in f.readlines():
- trips.append(parse(line))
- while True:
- ans = input("Do you want to enter new trip (y/n)")
- if ans == "n":
- break
- line = input("Enter data: ")
- trips.append(parse(line))
- random.shuffle(trips)
- for trip in trips:
- print(trip)
- trips = sorted(trips)
- print("----")
- for trip in trips:
- print(trip)
- df = pd.DataFrame.from_records([s.to_dict() for s in trips])
- df.to_csv("trips.csv")
- print(df)
- char_records = []
- for model in df['brand'].unique():
- record = char[model].to_dict()
- record['model'] = model
- char_records.append(record)
- df = pd.DataFrame.from_records( char_records)
- print("----")
- print(df)
- df.to_csv("chars.csv")
- cars = set()
- for trip in trips:
- cars.add(trip.number)
- for car in cars:
- fuel, mileage, should_check = calculate_for_car(car, trips)
- print(car, ":", mileage, "km,", fuel, "lt, ", should_check)
- print(get_cars_for_check(cars, trips))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement