《数据分析与处理技术》课程作业5 pandas预处理

第1关:数据读取与合并

Pandas 模块导入

import pandas as pd

读取 csv 文件

pd.read_csv(path) #返回DataFrame

DataFrame合并

DataFrame 合并有三种方法:concatappendmerge

详情参见教材和官方文档。

注意:若出现如下错误,直接添加参数 sort=True 即可。 “ To accept the future behavior, pass 'sort=True'. …… ”

# -*- coding: utf-8 -*-

'''
第1关 数据读取与合并
现有源自世界银行的四个数据集:
1)economy-60-78.csv,
2)economy-79-19.csv,
3)population-60-78.csv,
4)population-79-19.csv,
其中分别存放了不同时间段(1960-1978和1979-2019)的
中国经济相关数据和中国人口及教育相关数据。
'''
#请将上述数据集内容读取至DataFrame结构中,
#年份为列索引,Indicator Name为行索引,
#观察其结构和内容,把它们合并为一个DataFrame,命名为ChinaData。
#输出ChinaData的形状
############begin############
import pandas as pd
# df=pd.read_csv("economy-60-78.csv",index_col = 0)#df的行索引就是economy-60-78.csv的第0列。
# df1=pd.read_csv("economy-79-19.csv",index_col = 0)
# df2=pd.read_csv("population-60-78.csv",index_col = 0)
# df3=pd.read_csv("population-79-19.csv",index_col = 0)
# ChinaData=pd.concat([df,df1,df2,df3],axis=1).iloc[:,:60]
# print(ChinaData.shape)

d1 = pd.read_csv('economy-60-78.csv',index_col = 0)#df的行索引就是economy-60-78.csv的第0列。
d2 = pd.read_csv('economy-79-19.csv',index_col = 0)
d3 = pd.read_csv('population-60-78.csv',index_col = 0)
d4 = pd.read_csv('population-79-19.csv',index_col = 0)
d12 = pd.concat([d1,d2],axis = 1,sort=True)
d34 = pd.concat([d3,d4],axis = 1,sort=True)
ChinaData = pd.concat([d34,d12],sort=True)
print(ChinaData.shape)
#############end#############

第2关:数据清洗

删除缺失值

DataFrame.dropna 方法用于删除含有缺失值的行或列,关键参数:axis 和how。

######axis

表示轴向,0 为行,1 为列,默认 0。

######how

表示删除形式,how = 'any' 表示只要有缺失值就删除;how='all' 表示全为缺失值才删除。

#####检测缺失值

DataFrame.isnull() 识别缺失值,返回包含TrueFalse的 DataFrame。 DataFrame.notnull() 方法识别非缺失值,返回包含TrueFalse的 DataFrame。 上述两方法结合 sum 函数可用于检测数据序列中缺失值的分布情况。

#####填充缺失值

DataFrame.fillna 方法能用指定值替换缺失值。关键参数:value、method和axis。

value

表示指定的填充值。

######method

method = 'bfill'后向填充,用后面的非缺失值填充; method = 'ffill'前向填充,用前面的非缺失值填充。

######axis

表示操作轴向,默认1(列)。

#####拉格朗日插值

from scipy.interpolate import lagrange

formula = lagrange(x,y)#formula是通过lagrange方法生成的公式,x和y为数据序列

ins_y = formula(ins_x)#ins_x为缺失值所在位置,ins_y为插值结果。

线性插值

from scipy.interpolate import interp1d#1是数字一

formula = interp1d(x,y,kind = 'linear')#formula是通过linear方法生成的公式,x和y为数据序列

ins_y = formula(ins_x)#ins_x为缺失值所在位置,ins_y为插值结果。

# -*- coding: utf-8 -*-
'''
第2关 数据清洗
'''
import pandas as pd
import numpy as np
d1 = pd.read_csv('economy-60-78.csv',index_col = 0)
d2 = pd.read_csv('economy-79-19.csv',index_col = 0)
d3 = pd.read_csv('population-60-78.csv',index_col = 0)
d4 = pd.read_csv('population-79-19.csv',index_col = 0)
d12 = pd.concat([d1,d2],axis = 1,sort=True)
d34 = pd.concat([d3,d4],axis = 1,sort=True)
ChinaData = pd.concat([d34,d12],sort=True)
'''
请针对ChinaData完成如下操作。
'''
# 2.1 删除空白行
# 提示:dropna,inplace
############begin############
a=ChinaData.shape
print("原表形状",a)
ChinaData.dropna(axis=0,how='all',inplace=True)
print("新表形状",ChinaData.shape)
print("{}个空白行被删除。".format(a[0]-ChinaData.shape[0]))


#############end#############

# 2.2 查找数据最完整(空值最少)的年份并输出
# 提示:notnull(),根据值找索引(上课讲过的方法)
############begin############
print(ChinaData.notnull().sum().idxmax())


#############end#############

# 2.3 前向填充"男性吸烟率(吸烟男性占所有成年人比例)",输出2000年至2019年的数据
# fillna,ffill
############begin############
data=ChinaData.fillna(axis=1,method='ffill')
print(data.loc["男性吸烟率(吸烟男性占所有成年人比例)",'2000':'2019'])

#############end#############

# 2.4 用2015年到2018年4年的gdp数据对2019年GDP数值进行拉格朗日插值预测,输出预测结果
# lagrange,
# 注意:x的取值从0开始,即x = np.array([0,1,2,3]),代表2015至2018 4年,2019年的x取值为4。
############begin############
from scipy.interpolate import lagrange
x = np.array([0,1,2,3])
y=ChinaData.loc['GDP','2015':'2018']
formula = lagrange(x,y)#formula是通过lagrange方法生成的公式,x和y为数据序列
ins_y = formula(4)#ins_x为缺失值所在位置,ins_y为插值结果。
print(ins_y)

#############end#############

# 2.5 用线性插值法填充“入学率,高等院校,男生(占总人数的百分比)”1995年到2002年数据,并输出插值后的94年至03年的数据
# interp1d
############begin############
from scipy.interpolate import interp1d#1是数字一
x=np.array([1994,2003])
y=np.array([4.68749,16.87404])
formula = interp1d(x,y,kind = 'linear')#formula是通过linear方法生成的公式,x和y为数据序列
ins_x=np.arange(1995,2003)
ins_y = formula(ins_x)#ins_x为缺失值所在位置,ins_y为插值结果。
ChinaData.loc['入学率,高等院校,男生(占总人数的百分比)','1995':'2002']=ins_y
print(ChinaData.loc['入学率,高等院校,男生(占总人数的百分比)','1994':'2003'])


#############end#############






第3关:数据转换

离差标准化

离差标准化就是对原始数据进行线性变换并映射至 [0,1] 区间的方法。该方法需要自行编写实现函数,建议参考教材或网络资源自行实现。

#####等宽离散化

等宽离散化将数据的值域分成宽度相同区间,根据数据所在区间取值,实现连续变量的离散化。pandas.cut函数可以实现这种操作,关键参数:x和bins。

######x

待离散化的数据。

######bins

离散化类别数。

######注意:

获得离散化结果后,常用value_counts()方法对离散化结果进行频数统计,以观察离散化数据的分布情况。

# -*- coding: utf-8 -*-

'''
第3关 数据转换
'''
import pandas as pd
d1 = pd.read_csv('economy-60-78.csv',index_col = 0)
d2 = pd.read_csv('economy-79-19.csv',index_col = 0)
d3 = pd.read_csv('population-60-78.csv',index_col = 0)
d4 = pd.read_csv('population-79-19.csv',index_col = 0)
d12 = pd.concat([d1,d2],axis = 1,sort=True)
d34 = pd.concat([d3,d4],axis = 1,sort=True)
ChinaData = pd.concat([d34,d12],sort=True)
'''
请针对ChinaData实现下列操作
'''
# 3.1 对“人口,总数”数据(1960-2018)进行离差标准化,并输出。
# 提示:自定义离差标准化函数,注意统计年份区间
############begin############
x=ChinaData.loc['人口,总数','1960':'2018'].sort_values()
bins=[]
for i in x:
   bins.append(round((i-x.min())/(x.max()-x.min()),6))
x=list(x.values)
x.append(ChinaData.loc['人口,总数','1960':'2018'].min()-1)
x.sort()
ChinaData.loc['人口,总数','1960':'2018']= pd.cut(ChinaData.loc['人口,总数','1960':'2018'],bins=x, labels=bins)
print(ChinaData.loc['人口,总数','1960':'2018'])


#############end#############

# 3.2 对“GDP 增长率(年百分比)”(1961-2018)数据进行等宽离散化为7类,输出分布情况
# 提示:cut,注意统计年份区间
############begin############
import numpy as np
x=np.array([-27.317,-20.617,-13.964,-7.311,-0.659,5.994,12.647,19.3])
bins=['(-27.317, -20.617]','(-20.617, -13.964]','(-13.964, -7.311]','(-7.311, -0.659]','(-0.659, 5.994]','(5.994, 12.647]','(12.647, 19.3]']
d1= pd.cut(ChinaData.loc['GDP 增长率(年百分比)','1961':'2018'],bins=x, labels=bins)
print(d1.value_counts())


#############end#############

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值