分类方法实验、pandas、imblearn、sklearn

环境:ubuntu、anaconda、python

背景:

实验室的老师写论文需要对照实验,进行数据分类,需要将下面的方法在这个数据集上进行实验。

多层前馈神经网络(MFFNN)、概率神经网络(PNN)、径向基神经网络、模糊神经网络、朴素贝叶斯、C4.5、随机森林、bagging、KNN、EasyEnsembleClassifier

数据集:

数据是这样的(如下图),每个xls文件是一个数据集,A列表示公司的代号,B之后的列是真实公司的特征,(老师没告诉具体是啥)。

要求:

需要将每一年的15个文件合并(按行横着合并)。数据里面有缺失的数据,需要进行填充处理。每年的标签1.xls文件对应的A1-A15的标签,值有(0, 1, 2)三个, 由于我做的实验不需要第3类,所以要删除标签第三类对应的数据。然后进行实验。

涉及到的技术:

sklearn、imblearn、pandas、os

完整代码:

https://github.com/dlagez/classification/blob/master/data_process/data_process.py

数据文件截图:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

步骤:

  • 将一个文件夹(年份)中多个xls文件按列合并,返回合并和的数据,DataFrame,先定义一个方法,后面需要用到。
def concat_xls(dir_name):
    dfs = []
    for filename in os.listdir(dir_name):
        if os.path.splitext(filename)[1] == '.xls':
            full_path = os.path.join(dir_name, filename)
            df = pd.read_excel(full_path, header=None, index_col=0)
            dfs.append(df)
    result = pd.concat(dfs, axis=1)
    return result

需要注意:读取时由于第一列是索引名,所以不需要代码自动生成索引名,列名需要自动生成。

 df = pd.read_excel(full_path, header=None, index_col=0)
  • 先把拼接起来的值存储起来(老师需要这个数据)
for year in range(2012, 2018):
    # print(year)
    data_root = '/data/file/classification_data/2012-2019/data_A/'
    data_name = os.path.join(data_root, str(year))
    # print(data_name)
    data = concat_xls(data_name)
    # print(data)
    data.columns = [i for i in range(data.shape[1])]
    data.to_csv(os.path.join('/data/file/classification_data/2012-2019/data_sum/'+str(year), 'data_'+str(year)+'.csv'))

注意拼接的数据列名都是混乱的,所以需要从新设置

data.columns = [i for i in range(data.shape[1])]
  • 处理拼接起来的数据的空值
for year in range(2012, 2018):
    data_root = '/data/file/classification_data/2012-2019/data_sum/'
    data_name = os.path.join(data_root+str(year), 'data_'+str(year)+'.csv')
    print(data_name)
    data = pd.read_csv(data_name, index_col=0)
    data_pro = data.fillna(data.mean(), axis=0)
    print(data_pro)
    data_pro.to_csv(os.path.join(data_root+str(year), 'data_pro.csv'))

这里的处理方式是均值填充

  • 将标签值添加到data_pro的末尾
for year in range(2012, 2018):
    data_root = '/data/file/classification_data/2012-2019/data_sum/'
    data_root_bq = '/data/file/classification_data/2012-2019/'
    data_name = os.path.join(data_root+str(year), 'data_pro.csv')
    data_pro_read = pd.read_csv(data_name, index_col=0)
    print(data_pro_read)
    bq = pd.read_excel(os.path.join(data_root_bq+str(year), '标签1.xls'), header=None, index_col=0)
    bq.rename(columns={1: 'bq'}, inplace=True)
    print(bq)
    data_bq = pd.concat([data_pro_read, bq], axis=1)
    print(data_bq)
    data_bq.to_csv(os.path.join(data_root+str(year), 'data_bq.csv'))

添加的目的是为了删除第三类标签(2)对应的数据。

  • 删除含有标签2的列:数据和标签一起删除
for year in range(2012, 2018):
    data_root = '/data/file/classification_data/2012-2019/data_sum/'
    data_name = os.path.join(data_root+str(year), 'data_bq.csv')
    data = pd.read_csv(data_name,  index_col=0)
    print(data)
    data_bq_drop = data.drop(index=data[data['bq'] == 2].index)
    # data_bq2013_drop = data_bq2013.drop(index=data_bq2013[data_bq2013['bq'] == 2].index)
    print(data_bq_drop)
    data_bq_drop.to_csv(os.path.join(data_root+str(year), 'data_bq_drop.csv'))
  • 将数据分成四份,训练数据、训练标签、测试数据、测试标签,为分类准备数据
for year in range(2012, 2018):
    data_root = '/data/file/classification_data/2012-2019/data_sum/'
    data_name = os.path.join(data_root+str(year), 'data_bq_drop.csv')
    data = pd.read_csv(data_name, index_col=0)
    print(data)
    train_size =3 * int(data.shape[0] / 4)
    test_size = int(data.shape[0] - train_size)
    train_data_all = data.iloc[:train_size]
    print(train_data_all)
    test_data_all = data.iloc[train_size:]
    print(test_data_all)
    train_data = train_data_all.iloc[:, :-1]
    print(train_data)
    train_label = train_data_all.iloc[:, -1]
    # train_label.columns = ['bq']
    print(train_label)
    test_data = test_data_all.iloc[:, :-1]
    test_label = test_data_all.iloc[:, -1]
    print(test_data)
    print(test_label)
    train_data.to_csv(os.path.join(data_root+str(year), 'train/train_data.csv'))
    train_label.to_csv(os.path.join(data_root+str(year), 'train/train_label.csv'))
    test_data.to_csv(os.path.join(data_root+str(year), 'train/test_data.csv'))
    test_label.to_csv(os.path.join(data_root+str(year), 'train/test_label.csv'))

由于数据比较多,所以将结果打印出来看看有没有错误的地方。

数据处理部分完成!

参考

https://zhuanlan.zhihu.com/p/110501972
https://blog.csdn.net/sinat_28442665/article/details/104901143

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dlage

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值