数学建模——数据的预处理

python处理excel数据

    • 1、将生成的矩阵导出至excel
    • 2、常用读取excel数据方式
    • 3、常用处理Excel读取结果的方法
    • 4、数据合并和数据连接
    • 5、数据清洗
      • 5.1、缺失值、重复值处理
      • 5.2、利用函数进行数据转换
      • 5.3、标准化
      • 5.4、类型化数据的哑变量处理
      • 5.5、连续型变量的离散化处理

1、将生成的矩阵导出至excel

python输出的矩阵太丑了不容易看,所以导出到excel中更容易查看。

import xlwt  # 负责写excel
import xlrd
filename =xlwt.Workbook() #创建工作簿
sheet1 = filename.add_sheet(u'sheet1',cell_overwrite_ok=True) #创建sheet
[h,l]=result.shape #h为行数,l为列数,result为需要写入的矩阵名
for i in range (h):
    for j in range (l):
        sheet1.write(i,j,result[i,j])
filename.save('保存文件命名.xls')

2、常用读取excel数据方式

数学建模中经常使用到excel的读取,此处记录一下。

#1、使用pandas
import pandas as pd
#2、读入文件
fp=pd.read_excel("我的excel文件.xlsx",sheet_name="Sheet1")#sheet_name选写
#3、读取行
data=fp.ix[0].values#不包括首行标题
#4、读取指定行
data=fp.ix[[1,2]].values#读取1,2行
#5、读取行列
data=fp.ix[1,2]。values#读取1行2列
#6、读取多行多列
data=fp.ix[[1,2],["姓名","年龄"]].values#读取1,2行,姓名和年龄两列的数据
#7、获取指定列
data=fp["姓名"].values
data=fp.ix[:,["姓名"]]

3、常用处理Excel读取结果的方法

#因为读入的文件是dataframe格式的,所以需要知道series和dataframe数据的操作方式
data=fp.iloc[:,0]# 读入所有行第一列的数据,是series格式的
a=list(data[data.values==0].index)#读入data中满足数据值是0的数据
#删除指定行、列
a=data.drop("列名/行名",axis=1)#1为列,0为行,默认为0
#满足指定函数的数据处理
f=lambda x:sum(x)
task_diff=task.apply(f)
#获得行、列的数量
num=fp.iloc[:,0].size#获得行数
num=fp.iloc[0,:].size
#获得行列名称
fp._stat_axis.values.tolist() # 行名称
fp.columns.values.tolist()    # 三种列名称
fp.columns
list(fp)
fp.keys()
#获取指定位置的数据,values[0]是不能变的
print fp.ix[[0]].values[0][0]#第一行第一列的值 11
print fp.ix[[1]].values[0][1]#第二行第二列的值 121
#和并Series
a=fp["企业代号"]
b=fp["开票日期"]
date= pd.DataFrame({"企业代号":a,"开票日期":b})
#分组获得需要的信息并经数据处理
x=date.groupby("企业代号").first()
y=date.groupby("企业代号").last()
df=df[~df['开票日期'].isin(['NaT'])]
#导出dataframe为excel
file=df
file.to_excel("时间.xlsx")
file.to_csv("data.csv")

更多dataframe操作

4、数据合并和数据连接

#数据合并
##进行左连接
a=pd.merge(price,amount,how='left')
##数据合并并填充
a=left.combine_first(right) #用right补充left
#数据连接
##多个series的连接
s1 = pd.Series([0,1],index = ['a','b'])
s2 = pd.Series([2,3,4],index = ['a','d','e'])
s3 = pd.Series([5,6],index = ['f','g'])
print(pd.concat([s1,s2,s3]))  #Series行合并
print(pd.concat([s1,s2,s3],axis=1))#列合并
##多个dataframe数据连接
data1 = pd.DataFrame(np.arange(6).reshape(2,3),columns = list('abc'))
data2 = pd.DataFrame(np.arange(20,26).reshape(2,3),columns = list('ayz'))
data = pd.concat([data1,data2],axis = 0,sort=False)

5、数据清洗

5.1、缺失值、重复值处理

#1、检验缺失值(a is a series/b is a dataframe)
a.isnull()#[.sum()]
b.info()
#2、缺失值处理
##删除缺失值
a.dropna()
b.dropna(axis=0,how='all')#当一整行都是NaN时去除
b.dropna(thresh=n)#删除有Nan的行,只剩下n个Nan
##填充缺失值
a.fillna(data.mean())#均值填充
b[1]=df[1].fillna(df[1].mean())#在那一列中补充均值
b.fillna({"列名":"填充的数字"})
#3、重复值
##检验重复值
b.duplicated()
##去重
b.drop_duplicates()
b.drop_duplicates(["k1"],[keep='last'])#是否保留上一回删除内容
#4、异常值
##利用3σ法则检测异常值
def outRange(S):
    blidx = (S.mean()-3*S.std()>S)|(S.mean()+3*S.std()<S)
    idx = np.arange(S.shape[0])[blidx]
    outRange = S.iloc[idx]
    return outRange
outier = outRange(wdf['Y'])
outier
#5、数据转换
##数字替换
b.replace("需要替换的值","替换值")

5.2、利用函数进行数据转换

#利用函数或映射的方式进行数据转换
def grade(x):
    if x>=90:
        return '优'
    elif 70<=x<90:
        return '良'
    elif 60<=x<70:
        return '中'
    else:
        return '差'
df['等级'] = df['成绩'].map(grade)

5.3、标准化

#离差标准化
def MinMaxScale(data):
    data = (data-data.min())/(data.max()-data.min())
    return data
x = np.array([[ 1., -1.,  2.],[ 2.,  0.,  0.],[ 0.,  1., -1.]])
print('原始数据为:\n',x)
x_scaled = MinMaxScale(x)
print('标准化后矩阵为:\n',x_scaled,end = '\n')
#标准差标准化
def StandardScale(data):
    data = (data-data.mean())/data.std()
    return data
x = np.array([[ 1., -1.,  2.],[ 2.,  0.,  0.],[ 0.,  1., -1.]])
print('原始数据为:\n',x)
x_scaled = StandardScale(x)
print('标准化后矩阵为:\n',x_scaled,end = '\n')

5.4、类型化数据的哑变量处理

df = pd.DataFrame([  
            ['green', 'M', 10.1, 'class1'],   
            ['red', 'L', 13.5, 'class2'],   
            ['blue', 'XL', 15.3, 'class1']])  
df.columns = ['color', 'size', 'prize','class label']  
print(df)
pd.get_dummies(df) 

5.5、连续型变量的离散化处理

#等宽法
np.random.seed(666)
score_list = np.random.randint(25, 100, size = 10)
print('原始数据:\n',score_list)
bins = [0, 59, 70, 80, 100]
score_cut = pd.cut(score_list, bins)
print(pd.value_counts(score_cut)) 
#等频法
def SameRateCut(data,k):
    k = 2
    w = data.quantile(np.arange(0,1+1.0/k,1.0/k))
    data = pd.cut(data,w)
    return data
result = SameRateCut(pd.Series(score_list),3)
result.value_counts()

你可能感兴趣的:(数学建模,python,excel)