Advertisement
Guest User

Untitled

a guest
Dec 10th, 2018
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.80 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Fri Dec 7 19:47:32 2018
  4.  
  5. @author: utilisateur
  6. """
  7.  
  8. # -*- coding: utf-8 -*-
  9. """
  10. Created on Wed Dec 7 21:05:01 2016
  11.  
  12. @author: utilisateur
  13. """
  14. import numpy as np
  15. import matplotlib.pyplot as plt
  16. import math as m
  17.  
  18. class Population:
  19. AGEMAX = 119
  20.  
  21.  
  22. def __init__(self, popmale, popfemale, nom = 'exemple de population', year=2020, fec = 2, espm = 67, espf = 72, sr = 102, tmi = 2.5):
  23. # en entrée popmale et popfemale sont des listes
  24. self.complete(popmale) # juste pour ajouter des zeros
  25. self.complete(popfemale) # juste pour ajouter des zeros
  26. self.nom = nom
  27. self.popm = np.array(popmale) # tableau numpy de la population masclune par tranche d'age 0 à 130 ans
  28. self.popf = np.array(popfemale) # idem pop feminine
  29. self.year = year
  30. self.fec = fec # indice synthétique de fécondité
  31. self.espm = espm # espérance de vie masculine
  32. self.espf = espf # espérance de vie des meufs
  33. self.sr = sr # sex ratio à la naissance (garçons pour 100 filles)
  34. self.loinat = np.zeros((Population.AGEMAX))
  35. self.loinat[20:37] = 1/17 # loi de natalité simpliste. A affiner plus tard
  36. self.tmi = tmi #taux de mortalité infantile
  37.  
  38. def complete(self, pop):
  39. if len(pop)<Population.AGEMAX:
  40. pop.extend([0]*(Population.AGEMAX-len(pop)))
  41.  
  42.  
  43. def loimort(self): # loi de la probabilité de mourir, par année, pour hommes et femmes
  44. # approximation : somme d'une exponentielle décroissante et d'une croissance
  45. # la valeur en zéro est donnée par le taux de mortalité infantile
  46. # l'espérance de vie est un résultat indirect, on approche avec une loi empirique
  47. A = 0.001/m.exp(40/13)
  48. Poly1 = np.array([ -6.24e-07,3.57e-04,1.24e-01,-2.61e-01])
  49. taum = np.polyval(Poly1, self.espm)
  50. tauf = np.polyval(Poly1, self.espf)
  51. age = np.array(range(Population.AGEMAX))
  52. loimort_m = (self.tmi/1000)*np.exp(-age/3) + A* np.exp(age/taum)
  53. loimort_f = (self.tmi/1000)*np.exp(-age/3) + A* np.exp(age/tauf)
  54. #on écrète à 1
  55. loimort_m = [min(1, a) for a in loimort_m]
  56. loimort_f = [min(1, a) for a in loimort_f]
  57. return(loimort_m, loimort_f)
  58.  
  59.  
  60. def increm(self):# une année passe
  61.  
  62. # nombre de naissances
  63. nbbb = self.fec * np.dot(self.popf, self.loinat.T)
  64. garcons = (self.sr/(100+self.sr))*nbbb
  65. filles = nbbb-garcons
  66.  
  67. # on vieillit tout le monde d'un an puis on ajoute les naissances
  68. self.popm = np.roll(self.popm, 1, 0)
  69. self.popf = np.roll(self.popf, 1, 0)
  70. self.popm[0]=garcons
  71. self.popf[0]=filles
  72.  
  73. # on tue des gens :'(
  74. (loimort_m, loimort_f) = self.loimort()
  75. morts_m = self.popm * loimort_m # morts masc par age
  76. morts_f = self.popf * loimort_f # idem femmes
  77. self.popm = np.floor(self.popm - morts_m)
  78. self.popf = np.floor(self.popf - morts_f)
  79. self.year = self.year+1
  80.  
  81. # il faudra ajouter ici l'immigration et l'émigration, à gérer comme des pyramides
  82. # des ages qu'on ajoute et soustrait à la principale
  83.  
  84. return None
  85.  
  86.  
  87. def bilan(self, ageact=(20, 60)): #retourne un pointage de la population à la date courante
  88. # ageact est un tuple : age min et max de la vie active
  89. age = np.array(range(Population.AGEMAX))
  90. popt = self.popf+self.popm
  91. bilan= {}
  92. bilan['totalm'] = np.sum(self.popm)
  93. bilan['totalf'] = np.sum(self.popf) # pop totale
  94. bilan['total'] = bilan['totalm'] + bilan['totalf'] # pop totale
  95.  
  96. bilan['agemoym'] = np.sum(self.popm*age)/np.sum(self.popm) # age moy m
  97. bilan['agemoyf'] = np.sum(self.popf*age)/np.sum(self.popf) # age moyen femmes
  98. bilan['agemoy'] = np.sum(self.popm*age+self.popf*age)/bilan['total'] # age moyen femmes
  99.  
  100. bilan['agemedm'] = self.agemed(self.popm)
  101. bilan['agemedf'] = self.agemed(self.popf)
  102. bilan['agemed'] = self.agemed(popt)
  103.  
  104. bilan['depjeune'] = np.sum(popt[:ageact[0]]) # population dépendante jeune
  105. bilan['actifs'] = np.sum(popt[ageact[0]:ageact[1]]) # population active
  106. bilan['retraites'] =np.sum( popt[ageact[1]:] ) # population dépendante retraitée
  107.  
  108. bilan['txactif'] = bilan['actifs']/bilan['total'] # taux d'activité
  109. bilan['ratioretr'] = bilan['actifs']/bilan['retraites'] #actifs par retraité
  110.  
  111. return bilan
  112.  
  113. def agemed(self, pyramide):
  114. cs = np.cumsum(popm)
  115. app = (cs<cs[-1]/2).argmin() -1 # ça retourne la position du premier True
  116. exact = app + (cs[-1]/2-cs[app])/popm[app] #♣ on ajoute un bout d'année
  117. return exact
  118.  
  119.  
  120. def genocide(self):
  121. self.popm = np.zeros((1, Population.AGEMAX))
  122. self.popf = np.zeros((1, Population.AGEMAX))
  123.  
  124.  
  125. def dessin(self, ax, ageact=(20, 60)): # trace la pyramide des âges dans le système d'axes désigné
  126. age = np.array(range(Population.AGEMAX))
  127. # filtre pop active
  128. selec = np.array( [0]*ageact[0]+ [1]*(ageact[1] - ageact[0])+ [0]*(Population.AGEMAX - ageact[1]))
  129. ax.barh(age, -selec*self.popm/1000, color='b', ec = 'b')
  130. ax.barh(age, selec*self.popf/1000, color='r', ec = 'r')
  131. ax.barh(age, -(1-selec)*self.popm/1000, color='mediumslateblue', ec = 'mediumslateblue')
  132. ax.barh(age, (1-selec)*self.popf/1000, color='lightcoral', ec = 'lightcoral')
  133. ax.plot([0, 0], [0, Population.AGEMAX+1], color = 'black') # ligne noire au centre
  134. ax.set_title(self.nom + ', ' + str(self.year))
  135. ax.set_xlabel(u'Milliers', fontname='DejaVu Sans Mono')
  136. ax.set_ylabel(u'âge', fontname='DejaVu Sans Mono')
  137.  
  138. posx = (1/2)*max(self.popm)/1000
  139. ax.text(-posx, 0.9*Population.AGEMAX, '♂', fontname='DejaVu Sans Mono', fontsize=22, color='b', fontweight='bold')
  140. ax.text(posx, 0.9*Population.AGEMAX, '♀', fontname='DejaVu Sans Mono', fontsize=22, color='r',fontweight='bold')
  141. return None
  142.  
  143.  
  144.  
  145.  
  146.  
  147.  
  148.  
  149. f = open('france2018.txt', 'r') # france en 2018, attention, ordre : femmes, hommes
  150. popm = []
  151. popf = []
  152. for line in f:
  153. A = line.split('\t')
  154. popf.append(int(A[0]))
  155. popm.append(int(A[1]))
  156.  
  157. france = Population(popm, popf, year=2018, fec = 1.8, espm = 71, espf = 75, nom = 'France')
  158. b2018 = france.bilan()
  159. f1 = plt.figure()
  160. f1.patch.set_facecolor('white')
  161. ax1 = f1.add_subplot(121)
  162. ax2 = f1.add_subplot(122)
  163.  
  164.  
  165. france.dessin(ax1)
  166.  
  167. for i in range(25):
  168. france.increm()
  169. b2043 = france.bilan()
  170.  
  171. france.dessin(ax2)
  172. f1.set_tight_layout(True)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement