Advertisement
Guest User

Untitled

a guest
Nov 13th, 2018
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 19.58 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2.  
  3. # Travail TD2
  4. # Groupe : Ismail NADA et Marcellin CHAMBU
  5. # Date : 01/11/2018
  6. ############################################################
  7. # Je crée mes trois classes
  8. # En suite je vais y ajouter progressivement les fonctions d'intérêt pour réaliser ce mandat
  9. class Company:
  10. """ Ma classe parent s'appelle Company
  11. Elle devra contenir les listes des Drivers, des Cars et la liste contentant les Drivers+Cars.
  12. """
  13. def __init__(self, name):
  14. """ __init__ est le constructeur de Company.
  15. Note:`self` est un paramètre qu'il n'est pas nécessaire d'envoyer.
  16. Args:name (str): nom de la compagnie.
  17. """
  18. self.name = name.lower() # je construit une emplacement dans Company pouvant contenir le nom de ma compagnie
  19. self.listCars = [] # je crée dans Company une liste vide devant contenir les données des voitures
  20. self.listDrivers = [] # je crée dans Company une liste vide devant contenir les données des chauffeurs
  21. self.companyfile = [] # je crée dans Company une liste vide devant contenir les données des chauffeurs
  22.  
  23. def addCar(self, car):
  24. """ addCar est une méthode permettant d'ajouter un objet Car dans la liste des voitures.
  25. Note:`self` est un paramètre qu'il n'est pas nécessaire d'envoyer.
  26. Args: data_cars: liste des voitures.
  27. """
  28. self.listCars.append(car) # permet d'ajouter un objet car dans listCar (la liste des voitures)
  29.  
  30. def addDriver(self, driver):
  31. """addDriver est une méthode permettant d'ajouter un objet Driver dans la liste.
  32. Note:`self` est un paramètre qu'il n'est pas nécessaire d'envoyer.
  33. Args:driver (Driver): Chauffeur à ajouter.
  34. """
  35. self.listDrivers.append(driver) # permet d'ajouter un objet driver dans la listDriver (la liste des chauffeurs)
  36.  
  37. def readCarCsv(self):
  38. """readCarCsv est une méthode permettant de lire le fichier csv des Cars.
  39. Note:`self` est un paramètre qu'il n'est pas nécessaire d'envoyer.
  40. Args:pas nécessaire.
  41. """
  42. import csv
  43. with open('cars.csv','rb') as csvfile: # j,importe un fichier csv des voitures
  44. csvreader = csv.reader(csvfile, delimiter=',')
  45. for row in csvreader:
  46. mycar = Car(row[0], row[1], row[2], row[3], row[5], row[6], row[7], row[8]) # je crée un objet mycar
  47. # qui est une liste tenant en compte que les données pertinentes (sauf row[4]) du fichier csv
  48.  
  49. self.addCar(mycar) # je demande d'ajouter l'objet mycar quand je fais appel à la méthode addCar
  50.  
  51. def readDriverCsv(self):
  52. """readDriverCsv est une méthode permettant de lire le fichier csv des Drivers.
  53. Note:`self` est un paramètre qu'il n'est pas nécessaire d'envoyer.
  54. Args:pas nécessaire.
  55. """
  56. import csv
  57. with open('drivers.csv' ,'rb') as csvfile: # j,importe un fichier csv des chauffeurs
  58. csvreader = csv.reader(csvfile, delimiter=',')
  59. for row in csvreader:
  60. mydriver = Driver(row[0], row[1], row[2], row[3]) # je crée un objet mydriver
  61. # qui est une liste contenant les données du fichier csv des chauffeurs
  62. self.addDriver(mydriver) #je demande d'ajouter l'objet mydriver quand je fais appel à la méthode addDriver
  63.  
  64. def CarAndDriverInOneListe(self):
  65. """CarAndDriverInOneListe est une méthode permettant de créer une liste contenant à la fois les données des
  66. chauffeurs et des voitures.
  67. Note:`self` est un paramètre qu'il n'est pas nécessaire d'envoyer.
  68. Args:pas nécessaire.
  69. """
  70. for k in macompany.listCars: # je parcours ma liste des voitures
  71. for d in macompany.listDrivers: # je parcours ma liste des chauffeurs
  72. if int(k.carId) == int(d.id): # si le Id de la voiture correspond à celui du chauffeur
  73. macompany.companyfile.append([k.carId, k.lat, k.long, d.firstName,
  74. d.lastName, k.model, k.make, k.occ, d.sex, k.year, k.adapt])
  75. # alors j'ajoute les données des chauffeurs et voitures (construites sous ces index dans les class
  76. # Driver et Car)
  77.  
  78. def CSVWritter(self):
  79. """CSVWritter est une méthode permettant d'écrire une liste contenant à la fois les données des
  80. chauffeurs et des voitures.
  81. Note:`self` est un paramètre qu'il n'est pas nécessaire d'envoyer.
  82. Args:pas nécessaire.
  83. """
  84. import csv
  85. with open('companyfilelist.csv', 'wb') as csvfile: # je crée un fichier csv companyfilelist à écrire
  86. csvwriter = csv.writer(csvfile, delimiter=',')
  87. for d in macompany.companyfile: # je parcour ma liste contenant les données des chauffeurs et voitures
  88. csvwriter.writerow(d[:-3]) # et j'écris dans le fichier csv les lignes sauf les trois dernières qui
  89. # contiennent les données non démandées
  90.  
  91. def getCarById(self, id):
  92. """getCarById est une méthode pour retrouver une voiture dans la compagnie
  93. en fonction de l'identifiant
  94. Note:`self` est un paramètre qu'il n'est pas nécessaire d'envoyer.
  95. Args: id (int): identifiant de la voiture
  96. Returns: un objet Car si on trouve la voiture, sinon None
  97. """
  98. # je parcours la liste des voitures
  99. # quand je trouve celle avec le bon ID
  100. # je la retourne
  101. for c in self.listCars:
  102. if c.id == id:
  103. return c
  104.  
  105. def getDriverByCarId(self, id):
  106. """getDriverByCarId est une méthode pour retrouver un chauffeur dans la compagnie
  107. en fonction de l'identifiant de la voiture
  108. Note:`self` est un paramètre qu'il n'est pas nécessaire d'envoyer.
  109. Args:id (int): identifiant de la voiture
  110. Returns: un objet Driver si on trouve le chauffeur, sinon None
  111. """
  112. # je parcours les voitures et je retiens uniquement celle
  113. # dont le ID correspond à celui recherché
  114. for d in self.listDrivers:
  115. if d.carId == id:
  116. return d
  117.  
  118. def getNbCarByModel(self):
  119. """getNbCarByModel est une méthode qui permet de trouver le nombre des voitures selon leur modèle
  120. Note:`self` est un paramètre qu'il n'est pas nécessaire d'envoyer.
  121. Args:pas nécessaire
  122. Returns: le nombre des véhicules pour chaque modèle
  123. """
  124.  
  125. modelliste =[]
  126. for d in macompany.companyfile:
  127. modelliste.append(d[5])
  128. model =[]
  129. for k in modelliste:
  130. if k in model:
  131. pass
  132. else: model.append(k)
  133.  
  134. dico = {}
  135. for m in macompany.companyfile:
  136. modele = m[5]
  137. if modele not in dico:
  138. dico[modele] = [m[6]]
  139. else :
  140. dico[modele].append(m[6])
  141.  
  142. for r in range(len(model)):
  143.  
  144. print "%d véhicules sont de modèle %s %s" % (len(dico[model[r]]), m[6], model[r])
  145.  
  146. def getNbCarByYear(self):
  147. """getNbCarByYear est une méthode qui permet de trouver le nombre des voitures selon leur année de fabrication
  148. Note:`self` est un paramètre qu'il n'est pas nécessaire d'envoyer.
  149. Args:pas nécessaire
  150. Returns: le nombre des véhicules pour chaque année de fabrication
  151. """
  152. yesarslist =[]
  153. for d in macompany.companyfile:
  154. yesarslist.append(d[9])
  155. year =[]
  156. for y in yesarslist:
  157. if y in year :
  158. pass
  159. else:
  160. year.append(y)
  161.  
  162. dico = {}
  163. for m in macompany.companyfile:
  164. years = m[9]
  165. if years not in dico:
  166. dico[years] = [m[6]]
  167. else:
  168. dico[years].append(m[6])
  169.  
  170. for r in range(len(year)):
  171. print "%d véhicules sont de l'année %s" % (len(dico[year[r]]), year[r])
  172.  
  173. def getNbOfOccupiedCar(self):
  174. """getNbOfOccupiedCar est une méthode qui permet de trouver le nombre des voitures occupées à un instant t
  175. Note:`self` est un paramètre qu'il n'est pas nécessaire d'envoyer.
  176. Args:pas nécessaire
  177. Returns: le nombre des véhicules occupés
  178. """
  179.  
  180. carOcc = []
  181. for k in self.listCars:
  182. if int(k.occ) == 1:
  183. carOcc.append(k)
  184. return "%d voitures sont occupées en ce moment" % (len(carOcc))
  185.  
  186. def getNbOfFreeCar(self):
  187. """getNbOfFreeCar est une méthode qui permet de trouver le nombre des voitures libres à un instant t
  188. Note:`self` est un paramètre qu'il n'est pas nécessaire d'envoyer.
  189. Args:pas nécessaire
  190. Returns: le nombre des véhicules libres
  191. """
  192. carfree = []
  193. for k in self.listCars:
  194. if int(k.occ) == 0:
  195. carfree.append(k)
  196. return "%d voitures sont libres en ce moment" % (len(carfree))
  197. #
  198. def getNbCarDrivedByWomenByModel(self):
  199. """getNbCarDrivedByWomenByModel est une méthode qui permet de trouver le nombre des véhicules classés par modèle
  200. et dont le chauffeur est une femme
  201. Note:`self` est un paramètre qu'il n'est pas nécessaire d'envoyer.
  202. Args:pas nécessaire
  203. Returns: un chiffre entier (int)"""
  204. womendata = []
  205. for d in macompany.companyfile:
  206. if d[8] == "F" :
  207. womendata.append(d)
  208.  
  209. modelliste =[]
  210. for d in womendata:
  211. modelliste.append(d[5])
  212. model =[]
  213. for k in modelliste:
  214. if k in model:
  215. pass
  216. else: model.append(k)
  217.  
  218. dico = {}
  219. for m in womendata:
  220. modele = m[5]
  221. if modele not in dico:
  222. dico[modele] = [m[6]]
  223. else :
  224. dico[modele].append(m[6])
  225.  
  226. for r in range(len(model)):
  227. print "%d véhicules de modèle %s %s sont conduits par les femmes" % (len(dico[model[r]]), m[6], model[r])
  228.  
  229. def getNbCarDrivedByMenByModel(self):
  230. """getNbCarDrivedByMenByModel est une méthode qui permet de trouver le nombre des véhicules classés par modèle
  231. et dont le chauffeur est un homme
  232. Note:`self` est un paramètre qu'il n'est pas nécessaire d'envoyer.
  233. Args:pas nécessaire
  234. Returns: un chiffre entier (int)
  235. """
  236. mendata = []
  237. for d in macompany.companyfile:
  238. if d[8] == "M":
  239. mendata.append(d)
  240.  
  241. modelliste = []
  242. for d in mendata:
  243. modelliste.append(d[5])
  244. model = []
  245. for k in modelliste:
  246. if k in model:
  247. pass
  248. else:
  249. model.append(k)
  250.  
  251. dico = {}
  252. for m in mendata:
  253. modele = m[5]
  254. if modele not in dico:
  255. dico[modele] = [m[6]]
  256. else:
  257. dico[modele].append(m[6])
  258.  
  259. for r in range(len(model)):
  260. print "%d véhicules de modèle %s %s sont conduits par les hommes" % (len(dico[model[r]]) , m[6] , model[r])
  261.  
  262. def ShuttleStatistics(self):
  263. """ShuttleStatistics est une méthode qui permet de trouver les statistiques générales sur toute ma flotte.
  264. Note:`self` est un paramètre qu'il n'est pas nécessaire d'envoyer.
  265. Args:pas nécessaire
  266. Returns: les cinq statatistiques précédentes
  267. (stat1, stat2, stat3, stat4, stat5 et stat6)
  268. """
  269.  
  270. stat1 = macompany.getNbCarByModel()
  271. stat2 = macompany.getNbCarByYear()
  272. stat3 = macompany.getNbOfFreeCar()
  273. stat4 = macompany.getNbOfOccupiedCar()
  274. stat5 = macompany.getNbCarDrivedByWomenByModel()
  275. stat6 = macompany.getNbCarDrivedByMenByModel()
  276.  
  277. print stat1
  278. print stat2
  279. print stat3
  280. print stat4
  281. print stat5
  282. print stat6
  283.  
  284. def CarAndDistance(self):
  285. """CarAndDistance est une méthode qui calcule la distance de toutes les voitures de la flotte
  286. par rapport au client.
  287. Note:`self` est un paramètre qu'il n'est pas nécessaire d'envoyer.
  288. Args:pas nécessaire
  289. Returns: Distance en kilomètres entre voiture et client
  290. """
  291. #Je fais appel à une librairie mathématique pour le calcul des distances
  292.  
  293. from math import radians , sin , cos , sqrt , asin
  294. distance = []
  295. for v in macompany.companyfile:
  296. lat_v = float(v[1]) # latitude de la postition du véhicule (chauffeur)
  297. lon_v = float(v[2]) # longitude de la postition du client (demandeur de service)
  298.  
  299. # je défini aussi, les paramètres de calcul dont j'aurai besoin pour les calculs des distances:
  300. # les variations de la position du client se feront à ce niveau (lat_ref et lon_ref)
  301. lat_ref = 45.542969 # latitude de la postition du client (demandeur de service)
  302. lon_ref = -73.610119 # longitude de la postition du client (demandeur de service)
  303. R = 6372.8 # Rayon de la Terre en Kilomètres
  304. dLat = radians(lat_ref - lat_v) # différence des latitudes en radian
  305. dLon = radians(lon_ref - lon_v) # différence des longitudes en radian
  306. lat_veh = radians(lat_v) # Je converti la latitude du véhicule en radian
  307. lat_refe = radians(lat_ref) # Je converti la latitude du client en radian
  308.  
  309. a = sin(dLat / 2) ** 2 + cos(lat_veh) * cos(lat_refe) * sin(dLon / 2) ** 2
  310. c = 2 * asin(sqrt(a))
  311. distance.append(R * c)
  312.  
  313. voiture_dist = []
  314. for i in range(len(distance)):
  315. voiture_dist.append([macompany.companyfile[i][6],macompany.companyfile[i][5], macompany.companyfile[i][7],
  316. macompany.companyfile[i][10], distance[i]])
  317.  
  318. return voiture_dist
  319.  
  320. def ThreeAnyNearestCars(self):
  321. """ThreeAnyNearestCars est une méthode qui permet de trouver trois voitures les plus proches du client.
  322. Note:`self` est un paramètre qu'il n'est pas nécessaire d'envoyer.
  323. Args:pas nécessaire
  324. Returns: une liste des trois voitures les plus proches
  325. """
  326. car_dist = macompany.CarAndDistance()
  327. Anyfreecars = []
  328. for k in car_dist:
  329. if int(k[2]) == 0 :
  330. Anyfreecars.append(k)
  331. newdata = sorted(Anyfreecars , key=lambda k:k[4])
  332. newdata2 = newdata[:3]
  333. return "les trois véhicules les plus proches sont :%s"% (newdata2)
  334.  
  335. def ThreeAdaptedNearestCars(self):
  336. """ThreeAdaptedNearestCars est une méthode qui permet de trouver trois voitures adaptées
  337. les plus proches du client.
  338. Note:`self` est un paramètre qu'il n'est pas nécessaire d'envoyer.
  339. Args:pas nécessaire
  340. Returns: une liste des trois voitures adaptées les plus proches
  341. """
  342. car_dist = macompany.CarAndDistance()
  343. Adaptedfreecars = []
  344. for k in car_dist:
  345. if int(k[2]) == 0 and int(k[3]) == 1:
  346. Adaptedfreecars.append(k)
  347. newdata = sorted(Adaptedfreecars , key=lambda k:k[4])
  348. newdata2 = newdata[:3]
  349. return "les trois véhicules adaptés les plus proches sont:" % (newdata2)
  350.  
  351. class Car:
  352.  
  353. """ Car est une classe permettant de gérer l'entité Car.
  354. Une entité Car permet de conserver les informations de la voiture.
  355. Une entité Car dispose d'un identifiant, d'un modèle, d'un type, d'une année et d'un kilométrage.
  356. """
  357.  
  358. def __init__(self, carId, make, model, year, longitude, latitude, occupe, adapte ):
  359. """__init__ est le constructeur de Car.
  360. Cette méthode va créer un objet Car en mémoire.
  361. Note:self` est un paramètre qu'il n'est pas nécessaire d'envoyer.
  362. Args:id (int): identifiant de la voiture, make (str): marque de la voiture, model (str): modèle de la voiture,
  363. year (int): année de fabrication, longitude (float): longitude de
  364. localisation du véhicule, latitude (float): latitude de localisation du véhicule, occupe (int) : indique
  365. si le véhicule est occupé (1) ou libre (0), adapte (int): indique si le véhicule est adapté (1) ou non
  366. adapté (0)
  367. """
  368. self.carId = int(carId)
  369. self.make = str(make)
  370. self.model = str(model)
  371. self.year = int(year)
  372. self.long = float(longitude)
  373. self.lat = float(latitude)
  374. self.occ = int(occupe)
  375. self.adapt = int(adapte)
  376. class Driver:
  377. """ Driver est une classe permettant de gérer l'entité Driver.
  378. Une entité Driver permet de conserver les informations du chauffeur.
  379. Une entité Driver dispose d'un prénom, d'un nom, d'un genre et d'un identifiant de véhicule.
  380. """
  381.  
  382. def __init__(self, firstName, lastName, sex, id):
  383. """ __init__ est le constructeur de Driver.
  384. Cette méthode va créer un objet Driver en mémoire.
  385. Note:`self` est un paramètre qu'il n'est pas nécessaire d'envoyer
  386. firstName (str): prénom du chauffeur
  387. lastName (str): nom du chauffeur
  388. sex (str): genre du chauffeur
  389. """
  390. self.firstName = str(firstName)
  391. self.lastName = str(lastName)
  392. self.sex = str(sex)
  393. self.id = int(id)
  394. def setCarId(self, id):
  395. """setCarId est une méthode permettant d'attribuer un identifiant de voiture à un Driver.
  396. Cette méthode va attribuer le id de la voiture.
  397. Note:`self` est un paramètre qu'il n'est pas nécessaire d'envoyer.
  398. Args: id (int): identifiant de la voiture
  399. """
  400. self.carId = id
  401.  
  402. ############################################################
  403. ############################################################
  404. ########################################
  405. ########################################
  406. ########################################
  407. ########################################
  408. # je défini le nom de ma compagnie:
  409. macompany = Company("MarDa Trans")
  410. macompany.readCarCsv()
  411. macompany.readDriverCsv()
  412. # macompany.listCars
  413. # mycar=macompany.listCars[5]
  414. # print mycar.carId
  415. macompany.CarAndDriverInOneListe()
  416. # print macompany.listDrivers
  417. # print macompany.companyfile
  418. macompany.CSVWritter()
  419. # print macompany.getNbOfFreeCar()
  420. # print macompany.getNbOfOccupiedCar()
  421.  
  422. macompany.ShuttleStatistics()
  423. print macompany.ThreeAnyNearestCars()
  424. print macompany.ThreeAdaptedNearestCars()
  425. # print macompany.phoneCallManagerAnyCar()
  426.  
  427. ########################################
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement