一个帮助完成数据挖掘作业的小python程序.

138 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第6天,点击查看活动详情

前言:

在完成算法作业时突然想到,这次作业也就算了,下次还要手动计算就很烦,懒惰的我就准备写个python脚本来辅助我完成作业. image.png

image.png 主要使用了

import  numpy as  np
from scipy import stats

这两个库.

设计思路:

接收数据:

由于题目在word文档上,直接复制粘贴的话会将分隔符粘上,所以写一个函数来对接受数据进行处理和矫正.

def scan():
    data=input("输入数据:")
    char_flag=input('输入分割符:')
    data_list=data.split(char_flag)
    num_list=[]
    try:
        for data in data_list:
            num_list.append(int(data))
        print("输入了",len(num_list),'个数据','分别为:',num_list)
        return num_list
    except:
        print("输入的数据格式有问题,输入数据为:\n",data_list)

将接收的数据进行分割和格式转换. image.png

模式判断:

由于作业分为对两组数据进行关联性判断和对单组数据进行分析这两个需求,所以对于不同需求执行不同函数.

flag=input("几组数据?")
if(flag=='1'):
    datalen1()
elif (flag=='2'):
    datalen2()

用户手动输入,来选择执行的功能.

单组数据模式:

当只有一组数据时一般需要计算均值,中位数,众数,中列数,q1,q2,q3等数据,以及对数据的预处理.而对数据进行预处理有 最小最大规范化,

# 当只有一组数据时
def datalen1():
    numlist = scan()
    print("均值为:", np.mean(numlist))
    print("中位数为:", np.median(numlist))
    print("众数:", stats.mode(numlist)[0][0])
    print("中列数为:", (max(numlist) + min(numlist)) / 2)
    print("Q1:", np.percentile(numlist, (25)), "\nQ3:", np.percentile(numlist, (75)), "\n四分位差IQR:",
          np.percentile(numlist, (75)) - np.percentile(numlist, (25)))
    print('箱线图数据:\n上边缘:',
          np.percentile(numlist, (75)) + 1.5 * (np.percentile(numlist, (75)) - np.percentile(numlist, (25))))
    print("上四分位 q3:", np.percentile(numlist, (75)))
    print("中位数q2", np.percentile(numlist, (50)))
    print("下四分位q1", np.percentile(numlist, (25)))
    print("下边缘:", np.percentile(numlist, (25)) - 1.5 * (np.percentile(numlist, (75)) - np.percentile(numlist, (25))))


两组数据模式:

当有两组数据时一般需要计算曼哈顿距离,欧几里得距离,为当h=3时闵可夫斯基距离. 这三个距离共用同一个公式:

image.png 当q不同时,例如等于1时就是曼哈顿距离,2为欧几里得距离,因此可以通过同个规律实现. 在下方代码中将变量参数设为h.


# 当有两组数据时
def datalen2():
    numlist1=scan()
    numlist2=scan()

    # 闵可夫斯基距离
    print('曼哈顿距离,欧几里得距离,为当h=3时闵可夫斯基距离分别为:')
    for h in  range(1,4):#1到3循环三遍
        len_this=int(0)
        for i,j in zip(numlist1,numlist2):
            len_this += pow(abs(i - j),h)
        len_this=pow(len_this,1/h)
        print(len_this)

将对应数据进行相应的绝对值然后求幂最后相加然后再开次方.