大数据分析与可视化 之 实验03 Numpy实现数据分析

发布时间 2023-12-30 19:50:14作者: Ivan丶c

实验03 Numpy实现数据分析

实验学时:2学时
实验类型:验证
实验要求:必修

一、实验目的

  1. 掌握Numpy的字符串函数
  2. 掌握Numpy 统计函数
  3. 掌握Numpy排序、分组、线性代数函数

二、实验要求

通过编程实现使用Numpy字符串函数进行文本处理,使用统计函数进行数据分析等常用操作。

三、实验内容

任务1. 现有股票数据文件“股票数据分析.csv”,内有“日期,开盘价,最高价,最低价,收盘价,涨跌额,涨跌幅(%),成交量(股),成交金额(元)”等字段,现要分析成交量加权平均价格、时间加权平均价格、平均价、最高价、最低价、股票收益率。用Python与第三方库Numpy编写程序实现。

任务2. 在任务1的基础上,按周汇总计算每周开盘价(monday_open)、收盘价(friday_close)、最高价(week_high)、最低价(week_low)。用Python与第三方库Numpy编写程序实现。

任务3. 现有某校参加计算机等级考试的成绩数据文件“计算机等级考试成绩.xls”,现要进行如下数据分析:
(1)统计“电子信息工程”专业缺考的人数(成绩为0或空缺视为缺考)及缺考率(缺考率=(缺考人数*100/专业总人数)%);
(2)统计“动画”专业考试通过的人数(成绩>=60视为考试通过)及通过率。
用Python与第三方库Numpy编写程序实现。

test3.py

# edcoding:utf-8
from datetime import datetime

import numpy as np
import pandas as pd

np.set_printoptions(threshold=np.inf)


def task1():
    spj, cjl = np.loadtxt(open("股票数据分析.csv", encoding='utf-8'), dtype=str, delimiter=',', usecols=(5, 8),
                          unpack=True, skiprows=1)
    spl = []
    for i in range(0, spj.size):
        try:
            spl.append(float(spj[i]))
        except:
            continue
    sp = np.array(spl)
    cj1 = []
    for i in range(0, cjl.size):
        try:
            cj1.append(float(cjl[i]))
        except:
            continue
    cj = np.array(cj1)
    print("收盘价".center(60, '='), '\n', sp)
    print("成交量".center(60, '='), '\n', cj)
    cj_mean = np.average(sp, weights=cj)
    print("成交量加权平均价格".center(30, '='), '\n', cj_mean)
    t = np.arange(len(sp))
    time_mean = np.average(sp, weights=t)
    print("时间加权平均价格".center(30, '='), '\n', time_mean)
    ave = np.mean(sp)
    print("收盘价的平均价格".center(30, '='), '\n', ave)
    sp_max = np.max(sp)
    sp_min = np.min(sp)
    print("最高收盘价、最低收盘价".center(30, '='), '\n', sp_max, sp_min)
    sp_ptp = np.ptp(sp)
    sp_mid = np.median(sp)
    sp_var = np.var(sp)
    gpsyl = np.diff(sp) / sp[:1]
    dssyl = np.diff(np.log(sp))
    print("股票收益率、对数收益率".center(30, '='), '\n', gpsyl)
    print("股票对数收益率".center(30, '='), '\n', dssyl)
    zsyl = np.where(gpsyl > 0)
    print("收益率为正的交易日".center(30, '='), '\n', zsyl)


def task2():
    rq, kpj, spj = np.loadtxt(open("股票数据分析.csv", encoding='utf-8'), dtype=np.str_, delimiter=',', usecols=(1, 2, 5),
                              unpack=True, skiprows=1)
    list_kpj = []
    list_spj = []
    kpjsum = 0
    spjsum = 0
    for i in range(0, kpj.size):
        try:
            date_str = rq[i]
            date_obj = datetime.strptime(date_str, "%Y%m%d")
            day_of_week = date_obj.weekday()
            if day_of_week == 0:
                kpjsum += float(kpj[i])
                list_kpj.append(kpjsum)
                kpjsum = 0

                spjsum += float(spj[i])
                list_spj.append(spjsum)
                spjsum = 0
            else:
                kpjsum += float(kpj[i])
                spjsum += float(spj[i])
        except:
            continue
    kp = np.array(list_kpj)
    print("每周开盘价总和:", kp)

    print("=" * 30)
    sp = np.array(list_spj)
    print("每周收盘价总和:", sp)

    print("=" * 30)
    print("最高开盘价:", np.max(kp))
    print("最低开盘价:", np.min(kp))

    print("=" * 30)
    print("最高收盘价:", np.max(sp))
    print("最低收盘价:", np.min(sp))


def task3():
    df = pd.read_csv("计算机等级考试成绩.csv")

    missing_exam = df[(df['成绩'] == 0) | df['成绩'].isnull()]
    missing_count = len(missing_exam)
    total_count = len(df[df['专业'] == '电子信息工程'])
    missing_rate = (missing_count / total_count) * 100

    pass_count = len(df[(df['专业'] == '动画') & (df['成绩'] >= 60)])

    print(f"电子信息工程专业缺考人数: {missing_count}")
    print(f"电子信息工程专业缺考率: {missing_rate:.2f}%")
    print(f"动画专业考试通过人数: {pass_count}")


if __name__ == '__main__':
    task1()
    task2()
    task3()