# -*- coding: utf-8 -*-
"""
Created on Fri Dec 14 13:45:58 2018
@author: Administrator
"""
#import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import sklearn
#from sklearn.linear_model import LinearRegression
import os
datapath = os.path.join('datasets','lifesat','')
# 加载数据
file_path = r"D:\chengmi_吴限\python\handson-ml-master\handson-ml-master\datasets\lifesat\\"
file0 = open(file_path+"oecd_bli_2015.csv",'r', encoding='UTF-8')
file1 = open(file_path+"gdp_per_capita.csv",'r', encoding='latin1')
oecd_bli = pd.read_csv(file0,thousands = ',')
gdp_per_capita = pd.read_csv(file1,thousands = ',',delimiter = '\t',encoding = 'latin1',na_values = 'n/a')
'''
也许大多数人都有在Excel中使用数据透视表的经历,其实Pandas也提供了一个类似的功能,名为 pivot_table。
pandas的官方api上查到pivot()有三个参数,第一个index是重塑的新表的索引名称是什么,第二个columns是重塑的新表的列名称是什么,
一般来说就是被统计列的分组(每个分组是新的一列),第三个values就是生成新列的值应该是多少,如果没有,则会对data_df剩下未统计的列进行重新排列放到columns的上层。
重塑数据(产生一个“pivot”表格)以列值为标准。使用来自索引/列的唯一的值(去除重复值)为轴形成dataframe结果。
'''
oecd_bli = oecd_bli[oecd_bli["INEQUALITY"]=="TOT"]
oecd_bli['Value']
pd.DataFrame(oecd_bli.groupby(by = ['Country','Indicator']).aggregate(np.sum).loc[:,'Value'])
oecd_bli.pivot(index='Country',columns='Indicator',values='Value')
# 数据预处理
def prepare_country_stats(oecd_bli,gdp_per_capita):
oecd_bli = oecd_bli[oecd_bli["INEQUALITY"]=="TOT"]
# oecd_bli.columns
# oecd_bli['Indicator'].value_counts
# oecd_bli['Indicator'].describe(include=['object'])
oecd_bli = oecd_bli.pivot(index='Country',columns='Indicator',values='Value')
# oecd_bli.head()
gdp_per_capita.rename(columns={'2015':'GDP per capita'},inplace=True)
# gdp_per_capita.info()
# gdp_per_capita.columns
#查看数据集是否存在缺失值
# gdp_per_capita.apply(lambda x:np.sum(x.isnull()))
# gdp_per_capita[['GDP per capita','Units']].apply(lambda x:np.sum(x.isnull())) #'float' object has no attribute 'isnull'
gdp_per_capita.set_index('Country',inplace = True)
full_country_stats = pd.merge(left = oecd_bli,right = gdp_per_capita,left_index = True,right_index = True)
full_country_stats.sort_values(by = 'GDP per capita',inplace = True)
# full_country_stats['GDP per capita']
# full_country_stats.columns
# full_country_stats[['GDP per capita','Life satisfaction']].apply(lambda x:np.sum(x.isnull()))
remove_indices = [0,1,6,8,33,34,35]
keep_indices = list(set(range(36))-set(remove_indices))
return full_country_stats[['GDP per capita','Life satisfaction']].iloc[keep_indices]
#1:iloc[] 根据列中的元素,选取对应元素的数据集
#2:根据元素的选取条件来选取对应的数据集
#3:根据元素的选取条件来来选取对应的数据集,并在符合条件的数据行添加flage标签
# 准备数据
country_stats = prepare_country_stats(oecd_bli,gdp_per_capita)
x = np.c_[country_stats["GDP per capita"]]
y = np.c_[country_stats["Life satisfaction"]]
'''
np.r_是按列连接两个矩阵,就是把两矩阵上下相加,要求列数相等,类似于pandas中的concat()。
np.c_是按行连接两个矩阵,就是把两矩阵左右相加,要求行数相等,类似于pandas中的merge()。
'''
#可视化数据
country_stats.plot(kind='scatter',x='GDP per capita',y='Life satisfaction')
plt.show()
# 选择线性模型
lin_reg_model = sklearn.linear_model.LinearRegression()
#训练模型
lin_reg_model.fit(x,y)
# 对塞浦路斯进行预测
X_new = [[22587]] #赛普路斯的人均GDP
print(lin_reg_model.predict(X_new)) #outputs[[5.96242338]]
#K近邻模型
clf = sklearn.neighbors.KNeighborsRegressor(n_neighbors = 3)
clf.fit(x,y)
X_new = [[22587]] #赛普路斯的人均GDP
print(clf.predict(X_new)) #output[[5.76666667]]
'''
研究数据
选择模型
用训练数据进行训练(即,学习算法搜寻模型参数值,使代价函数最小)
使用模型对新案例进行预测
'''