-- coding: utf-8 --
"""model.ipynb
Automatically generated by Colaboratory.
Original file is located at https://colab.research.google.com/drive/1hA9Xz_VjzMVj66qS_j3A5dKcGkAfScKM """
pip install pycaret
from scipy import stats
import numpy as np
import pandas as pd
import pickle
import matplotlib.pyplot as plt
create fictitious data set
simple_life_dataset = pd.DataFrame({'Age':[0, 60], 'Life Expectancy':[90, 30]}) simple_life_dataset.head()
import numpy as np from scipy import stats slope, intercept, r_value, p_value, std_err = stats.linregress(simple_life_dataset['Age'],simple_life_dataset['Life Expectancy']) print('intercept: ', intercept) print('slope: ', slope)
np.ceil(slope * 20 + intercept)
fig, axes = plt.subplots(figsize=(5,5)) x = [0,20,60] y = [90, 70, 30] axes.plot(x,y, color='blue', linestyle='--', marker='o') fig.suptitle('Life Expectancy') axes.set_xlabel('age') axes.set_xlim([-5,100]) axes.set_ylabel('life_expectancy') axes.set_ylim([0,100]) plt.grid() plt.show()
load WHO longevity data
http://apps.who.int/gho/data/node.main.688
who_list = pd.read_csv('/content/drive/MyDrive/WHOSIS_000001,WHOSIS_000015.csv')
save a local copy of the data set for our Flask prototype later on
who_list.to_csv('WHOSIS_000001,WHOSIS_000015.csv')
Keep only useful features fix case display of country text
who_list = who_list[['GHO (DISPLAY)', 'YEAR (CODE)' , 'COUNTRY (DISPLAY)', 'SEX (DISPLAY)', 'Numeric']] who_list['COUNTRY (DISPLAY)'] = [ctry.title() for ctry in who_list['COUNTRY (DISPLAY)'].values]
print a few rows
who_list[who_list['COUNTRY (DISPLAY)']=='France'].head(10)
country = 'United States Of America' sex = 'Male'
pull latest entries for birth and 60 years for a country and gender
sub_set = who_list[who_list['COUNTRY (DISPLAY)'].str.startswith(country, na=False)] sub_set = sub_set[sub_set['SEX (DISPLAY)'] == sex]
sort by year in descending order to work with the latest read
sub_set = sub_set.sort_values('YEAR (CODE)', ascending=False) sub_set_birth = sub_set[sub_set['GHO (DISPLAY)'] == 'Life expectancy at birth (years)'] sub_set_60 = sub_set[sub_set['GHO (DISPLAY)'] == 'Life expectancy at age 60 (years)'] print('sub_set_birth:') print(sub_set_birth.head(5)) print('sub_set_60:') print(sub_set_60.head(5))
create data set with both points as shown in first example
lf_at_birth = sub_set_birth['Numeric'].values[0] lf_at_60 = sub_set_60['Numeric'].values[0]
let's organize our data and plot
age = [0,60] life_expectancy = [lf_at_birth, lf_at_60] fig, axes = plt.subplots(figsize=(5,5)) x = age y = life_expectancy axes.plot(x,y, color='blue', linestyle='--', marker='o') fig.suptitle('Life Expectancy') axes.set_xlabel('age') axes.set_xlim([-5,100]) axes.set_ylabel('life expectancy') axes.set_ylim([0,100]) plt.grid() plt.show()
model
slope, intercept, r_value, p_value, std_err = stats.linregress(age, life_expectancy) print('intercept: ', intercept) print('slope: ', slope)
predict life expectancy for an 49-year-old male in the USA:
np.ceil(slope * 49 + intercept)
def get_life_expectancy(age, country, sex): # pull latest entries for birth and 60 years sub_set = who_list[who_list['COUNTRY (DISPLAY)'].str.startswith(country, na=False)] sub_set = sub_set[sub_set['SEX (DISPLAY)'] == sex] sub_set = sub_set.sort_values('YEAR (CODE)', ascending=False) sub_set_birth = sub_set[sub_set['GHO (DISPLAY)'] == 'Life expectancy at birth (years)'] sub_set_60 = sub_set[sub_set['GHO (DISPLAY)'] == 'Life expectancy at age 60 (years)']
# not all combinations exsits so check that we have data for both
if len(sub_set_birth['Numeric']) > 0 and len(sub_set_60['Numeric']) > 0:
# create data set with both points as shown in first example
lf_at_birth = sub_set_birth['Numeric'].values[0]
lf_at_60 = sub_set_60['Numeric'].values[0]
# model
slope, intercept, r_value, p_value, std_err = stats.linregress([0,60],[lf_at_birth, lf_at_60])
# predict for the age variable
return(np.ceil(slope * age + intercept))
else:
return None
list(set(who_list['COUNTRY (DISPLAY)']))[0:10]
test the function out using a 22-year-old Japanese female:
get_life_expectancy(22, 'Japan', 'Female')
get_life_expectancy(22,'Pakistan','Female')
get_life_expectancy(21,'India','Male')
missing_values_count = who_list.isnull().sum()
print(missing_values_count)
get_life_expectancy(80,'Pakistan','Female')
pickle.dump(get_life_expectancy,open('model.pkl','wb'))
model=pickle.load(open('model.pkl','rb'))