数据挖掘与分析学习笔记

一、Numpy

NumPy(Numerical Python)是一种开源的Python库,专注于数值计算和处理多维数组。它是Python数据科学和机器学习生态系统的基础工具包之一,因为它高效地实现了向量化计算,并提供了对大型多维数组和矩阵的支持。

NumPy的定义要点:

  1. 核心对象:NumPy中最关键的对象是ndarray(n-dimensional array object),即N维数组,这是一种高效存储同构数据(所有元素类型相同的多维数组)的数据结构,适合进行大规模数值计算。

  2. 高效内存管理:ndarrays以一种连续的内存布局存储数据,使得CPU缓存利用更高效,从而加速了数学和逻辑运算。

  3. 数学函数库:NumPy包含了大量数学函数,这些函数可以直接作用于整个数组,无需使用循环,提高了执行效率。

  4. 广播功能:NumPy支持广播机制,允许不同形状的数组之间进行运算,自动进行元素级的逐点运算。

  5. 兼容性:NumPy与C/C++和Fortran编写的代码高度兼容,可以通过NumPy的C API集成其他高性能库。

使用领域:

  • 数据分析:在数据预处理阶段,NumPy被广泛用于数据清洗、转换、统计分析等任务。

  • 机器学习:作为大多数深度学习和机器学习框架(例如TensorFlow、PyTorch)的基础组件,NumPy提供的数组处理能力对于构建和训练模型至关重要。

  • 信号处理与图像处理:NumPy能够便捷地处理图像和信号数据,支持矩阵运算和快速傅里叶变换等算法。

  • 科学计算:包括物理模拟、工程计算、金融建模等领域,NumPy的高效数组运算和内置的线性代数功能十分有用。

  • 大数据处理:虽然不是专门的大数据工具,但NumPy数组结合Pandas等库,可在单机环境下处理大规模数据集。

总之,NumPy因其高效性和灵活性成为了众多Python开发者在涉及数值计算、科学计算及数据分析项目时首选的库。

1.赋值定义较复杂数据结构

对比Python的基本数据类型(列表、元组、字典等),数组具有更灵活的数据存储方式,比如一维数组和二维数组或者矩阵,特别是对于数值型数据来说更有优势,根据给出的列表L1=[1,2,3,4,0.1,7]和嵌套列表L2= [[1,2,3,4],(5,6,7,8)],请利用numpy包中的array()函数将其定义为一维数组和二维数据。

相关代码

import numpy as np
# 给定的列表
L1 = [1, 2, 3, 4, 0.1, 7]
L2 = [[1, 2, 3, 4], (5, 6, 7, 8)]
# 创建一维数组
array_1d = np.array(L1)
print("一维数组:")
print(array_1d)
# 创建二维数组(或矩阵)
# 注意:L2中的元组会被自动转换为列表,因为numpy数组要求元素类型一致
array_2d = np.array(L2)
print("二维数组:")
print(array_2d)

运行结果

2.内嵌函数定义较复杂数据结构

在编程过程中,预先定义一些数组变量用来保存程序产生的结果是非常必要的,请分别给出利用numpy包中ones ()、zeros()、arange()、linspace()函数定义的例子。

相关代码

import numpy as np
# 使用ones()创建一个3x3的全1数组
ones_array = np.ones((3, 3))
# 使用zeros()创建一个4x4的全0数组
zeros_array = np.zeros((4, 4))
# 使用arange()创建一个从0到10的整数数组,步长为2
arange_array = np.arange(0, 11, 2)
# 使用linspace()创建一个从0到10的等差数列,包含11个元素
linspace_array = np.linspace(0, 10, 11)
# 输出结果
print("全1数组 ones_array:")
print(ones_array)
print("\n全0数组 zeros_array:")
print(zeros_array)
print("\n使用arange()创建的数组 arange_array:")
print(arange_array)
print("\n使用linspace()创建的数组 linspace_array:")
print(linspace_array)

运行结果

3.数组运算

现有数组A=np.array([1,3,3.1,4.5])和B=np.array( [[1,2,3,4],(5,6,7,8),[9,10,11,12]]),请求解出A的最大值、最小值、正弦值、余弦值、长度和A乘B的程序。

相关代码

import numpy as np
# 定义数组A和B
A = np.array([1, 3, 3.1, 4.5])
B = np.array([[1, 2, 3, 4], (5, 6, 7, 8), [9, 10, 11, 12]])
# 计算A的最大值
max_A = np.max(A)
# 计算A的最小值
min_A = np.min(A)
# 计算A的正弦值
sin_A = np.sin(A)
# 计算A的余弦值
cos_A = np.cos(A)
# 计算A的长度
length_A = len(A)
# 计算A乘B
multi =A * B
# 输出结果
print("数组A的最大值:", max_A)
print("数组A的最小值:", min_A)
print("数组A的正弦值:", sin_A)
print("数组A的余弦值:", cos_A)
print("数组A的长度:", length_A)
print("数组A乘以B的结果:\n", multi)

运行结果

4.数组切片

现有数组A=np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]),编程实现如下功能:

1)将6、7、14、16这四个元素顺序切片出来构成一个2*2数组;

2)取第0列元素小于9的第2、3列数据,并赋值给B。

相关代码

import numpy as np
# 创建一个4x4的数组A
A = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]])
# 从数组A中选取第1行第1列、第1行第2列、第3行第1列和第3行第3列的元素
# 然后将其重塑为2x2的数组A_
A_ = np.array([A[1,1],A[1,2],A[3,1],A[3,3]]).reshape(2,2)
# 从数组A中选取第0列元素小于9的行,然后选取第2列和第3列的数据
B = A[A[:,0] < 9, [2,3]]
# 打印原始数组A
print(A)
# 打印重塑后的数组A_
print(A_)
# 打印数组B
print(B)

运行结果

5.数组连接

现有数组A=np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]])和B= np.array([1,1,1,1]),请将数组A和数组B进行水平连接获得新数组C,即C的前4列来源于A,最后一列来源于B。

相关代码

import numpy as np
# 定义数组A和B
A = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]])
B = np.array([1, 1, 1, 1])
# 将数组A和数组B水平连接,得到新数组C
C = np.column_stack((A, B))
# 输出结果
print("水平连接后的数组C:\n", C)

运行结果

二、Pandas

Pandas 是一个开源的 Python 库,专门为数据分析和处理而设计,它在数据科学、统计学和机器学习等领域具有广泛应用。Pandas 建立在 NumPy 数值计算库的基础上,为 Python 提供了高性能、易用且功能丰富的数据结构和数据分析工具。

Pandas 的定义要点:

  1. 数据结构:Pandas 主要引入了两种核心数据结构:

    • Series:一维数组,带标签的有序数据集,可以存储任意数据类型。
    • DataFrame:二维表格型数据结构,包含行和列索引,每一列可以是不同的数据类型,类似于关系型数据库中的表或电子表格。
  2. 数据处理能力:Pandas 提供了一系列强大的数据清洗、整合、重塑、过滤、分组、排序、统计分析等功能。

  3. I/O 功能:能够方便地从不同数据源(如CSV、Excel、SQL数据库、HDF5、JSON等)读取数据,并将数据写回上述格式或其他格式。

  4. 时间序列功能:特别擅长处理时间序列数据,拥有丰富的时间序列分析工具,如日期范围生成、频率转换、移动窗口统计等。

  5. 集成性:Pandas 良好的兼容性和集成性使其能无缝衔接其他 Python 库,如 matplotlib 用于可视化、NumPy 用于数值计算、SciPy 用于科学计算、Statsmodels 用于统计建模、Scikit-learn 用于机器学习等。

Pandas 的使用领域:

  • 数据分析:Pandas 在商业智能和数据分析中广泛用于数据探索、数据质量评估、数据预处理等步骤,帮助数据分析师快速理解数据分布、查找模式和异常。

  • 数据清洗和整理:Pandas 提供了一系列方法用于处理缺失值、重复值、异常值,以及数据类型转换、重命名、合并、切片、拼接等数据预处理工作。

  • 统计分析:支持复杂的数据聚合、分组运算、描述性统计分析,以及更深入的统计检验和模型拟合前的数据准备。

  • 机器学习和人工智能:在机器学习项目中,Pandas 是数据预处理阶段不可或缺的一部分,用于特征工程、特征选择和数据分割等任务。

  • 商业和科学研究:在各行各业的数据密集型工作中,包括但不限于金融、医疗、市场营销、社会科学研究等,Pandas 都是进行高效数据处理和分析的关键工具。

下面是一些常用的与数据读取相关的参数和关键字:

  • chunksize:用于指定每次读取的行数。当你使用read_csv或其他读取函数时,可以通过设置chunksize参数来分块读取数据。
  • dtype:用于指定列的数据类型。例如,你可以将某列指定为整数类型或浮点数类型。
  • usecols:用于指定要读取的列。你可以传递一个列名的列表,或者一个列名的字符串,以逗号分隔。
  • skiprows:用于指定要跳过的行数。你可以传递一个整数或一个整数列表,或者一个函数,该函数应该接受一个行索引并返回一个布尔值。
  • nrows:用于指定要读取的行数。这对于快速查看文件的前几行特别有用。
  • parse_dates:用于将某些列解析为日期类型。你可以传递一个列名的列表,或者一个包含列名和日期格式的字典。
  • squeeze:如果数据只包含一列,则返回Series而不是DataFrame。
1.序列和数据框

现有列表L1=[1,-2,2.3,'hq']、L2=[‘kl’,’ht’,’as’,’km’]和元组T1=(1,8,8,9)和T2=(2,4,7,’hp’)

1)请给出值为L1,采用默认索引和指定索引(’a’,’b’,’c’,’d’)两种方式的序列定义方法。

相关代码

import pandas as pd
L1 = [1, -2, 2.3, 'hq']
series_default_index = pd.Series(L1)
print("序列(默认索引):")
print(series_default_index)
import pandas as pd
L1 = [1, -2, 2.3, 'hq']
index_labels = ['a', 'b', 'c', 'd']
series_specified_index = pd.Series(L1, index=index_labels)
print("序列(指定索引):")
print(series_specified_index)

运行结果

2)请给出索引为’a’,’b’,’c’,’d’,列名和值分别为’L1’ ,’L2’ ,’T1’ ,’T2’及其值的数据框构造方法。

相关代码

import pandas as pd

L1 = [1, -2, 2.3, 'hq']
L2 = ['kl', 'ht', 'as', 'km']
T1 = (1, 8, 8, 9)
T2 = (2, 4, 7, 'hp')

# 为了创建一个DataFrame,我们需要一个列表的列表或者字典,其中键是列名
data = {
    'L1': L1,
    'L2': L2,
    'T1': list(T1),  # 将元组转换为列表
    'T2': list(T2)  # 将元组转换为列表
}

# 构造数据框,并指定索引
df = pd.DataFrame(data, index=['a', 'b', 'c', 'd'])
print("数据框:")
print(df)

运行结果

2.外部数据文件读取
1)请读取“一、车次上车人数统计表.xlsx”中的sheet2数据,用一个数据框df1来表示;

相关代码

import pandas as pd
# 1)读取Excel文件中的sheet2数据
file_path_excel = "一、车次上车人数统计表.xlsx"
sheet_name = "Sheet2"
df1 = pd.read_excel(file_path_excel, sheet_name=sheet_name)
print(df1)

运行结果

2)请读取文本文件txt1中的数据,用一个数据框df2来表示;

相关代码

import pandas as pd
file_path_txt = "txt1.txt"
df2 = pd.read_csv(file_path_txt, sep="\t")  # 假设文本文件使用制表符分隔
print(df2)

运行结果

3)大容量文件的读取需要采用分块读取的方式来处理数据,比如csv文件常用来存放大容量文件。请采用分块读取的方式读取“data.csv”文件,每次读取20000行,读取出来的数据分别用数据框A1,A2,A3,A4……等来表示。

相关代码

import pandas as pd
file_path_csv = "data.csv"
chunksize = 20000
chunks = []

# 读取CSV文件的每个块
for chunk in pd.read_csv(file_path_csv, chunksize=chunksize):
    chunks.append(chunk)

# 将每个块的数据框存储在列表中
dataframes = []
for i, chunk in enumerate(chunks):
    df_name = f"A{i+1}"
    df = pd.DataFrame(chunk)
    dataframes.append(df)
    print(f"创建的数据框 {df_name}:\n", df)

运行结果

3.数据框关联操作

请根据以下定义的两个字典 dict1 和 dict2,完成如下任务:

dict1={'code':['A01','A01','A01','A02','A02','A02','A03','A03'],'month':['01','02','03','01','02','03','01','02'],'price':[10,12,13,15,17,20,10,9]}

dict2={'code':['A01','A01','A01','A02','A02','A02'],'month':['01','02','03','01','02','03'], 'vol':[10000,10110,20000,10002,12000,21000]}

1)将两个字典转化为数据框;

相关代码

import pandas as pd
# 定义字典
dict1 = {
    'code': ['A01', 'A01', 'A01', 'A02', 'A02', 'A02', 'A03', 'A03'],
    'month': ['01', '02', '03', '01', '02', '03', '01', '02'],
    'price': [10, 12, 13, 15, 17, 20, 10, 9]
}
dict2 = {
    'code': ['A01', 'A01', 'A01', 'A02', 'A02', 'A02'],
    'month': ['01', '02', '03', '01', '02', '03'],
    'vol': [10000, 10110, 20000, 10002, 12000, 21000]
}
# 将字典转换为数据框
df1 = pd.DataFrame(dict1)
df2 = pd.DataFrame(dict2)
print(df1)
print(df2)

运行结果

2)对两个数据框完成内连接、左连接、右连接,并将结果输出;

相关代码

import pandas as pd
# 定义字典
dict1 = {
    'code': ['A01', 'A01', 'A01', 'A02', 'A02', 'A02', 'A03', 'A03'],
    'month': ['01', '02', '03', '01', '02', '03', '01', '02'],
    'price': [10, 12, 13, 15, 17, 20, 10, 9]
}
dict2 = {
    'code': ['A01', 'A01', 'A01', 'A02', 'A02', 'A02'],
    'month': ['01', '02', '03', '01', '02', '03'],
    'vol': [10000, 10110, 20000, 10002, 12000, 21000]
}
# 将字典转换为数据框
df1 = pd.DataFrame(dict1)
df2 = pd.DataFrame(dict2)
# 1)内连接
inner_join = pd.merge(df1, df2, on=['code', 'month'], how='inner')
print("内连接结果:\n", inner_join)
# 2)左连接
left_join = pd.merge(df1, df2, on=['code', 'month'], how='left')
print("\n左连接结果:\n", left_join)
# 3)右连接
right_join = pd.merge(df1, df2, on=['code', 'month'], how='right')
print("\n右连接结果:\n", right_join)

运行结果

4.数据框合并操作

请定义三个字典dict1、dict2和dict3,完成如下任务:

dict1={'a':[2,2,'kt',6],'b':[4,6,7,8],'c':[6,5,np.nan,6]}

dict2={'d':[8,9,10,11],'e':['p',16,10,8]}

dict3={'a':[1,2],'b':[2,3],'c':[3,4],'d':[4,5],'e':[5,6]}

1)将三个字典转化为数据框df1、df2、df3;

相关代码

import pandas as pd
import numpy as np

# 定义字典并转化为数据框
dict1 = {'a': [2, 2, 'kt', 6], 'b': [4, 6, 7, 8], 'c': [6, 5, np.nan, 6]}
dict2 = {'d': [8, 9, 10, 11], 'e': ['p', 16, 10, 8]}
dict3 = {'a': [1, 2], 'b': [2, 3], 'c': [3, 4], 'd': [4, 5], 'e': [5, 6]}
df1 = pd.DataFrame(dict1)
df2 = pd.DataFrame(dict2)
df3 = pd.DataFrame(dict3)
# 1)将三个字典转化为数据框
print("df1:")
print(df1)
print("\ndf2:")
print(df2)
print("\ndf3:")
print(df3)

运行结果

2)df1和df2进行水平合并,合并后的数据框记为df4;

相关代码

# 2)df1和df2进行水平合并
df4 = pd.concat([df1, df2], axis=1)
print("\ndf1和df2水平合并结果df4:")
print(df4)

运行结果

3)df3和df4垂直合并,并修改合并后的index为按默认顺序排列。

相关代码

# 3)df3和df4垂直合并,并修改合并后的index为按默认顺序排列
df_final = pd.concat([df3, df4], axis=0).reset_index(drop=True)
print("\ndf3和df4垂直合并结果(重置索引后):")
print(df_final)

运行结果

5.序列移动计算方法应用

定义列表L=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],并转化为序列S,采用序列中的方法,实现周期为10的移动求和、求平均值、求最大值、求最小值的计算,并输出序列为10的移动计算的最小值的结果。

相关代码

import pandas as pd
L = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
S = pd.Series(L)
# 移动求和
moving_sum = S.rolling(window=10).sum()
# 求平均值
moving_mean = S.rolling(window=10).mean()
# 求最大值
moving_max = S.rolling(window=10).max()
# 求最小值
moving_min = S.rolling(window=10).min()
print("移动求和结果:", moving_sum)
print("平均值结果:", moving_mean)
print("最大值结果:", moving_max)
print("最小值结果:", moving_min)

运行结果

6.数据框切片(iloc、loc)方法

数据框中有两种方式可以实现切片,通过索引实现(iloc)和列标签实现(loc)。请读取地铁站点进出站客流数据表(Data.xlsx),并完成如下任务:

1)采用索引实现的方式,获取135站点10月1日-10月2日早上9-11点3个时刻的进站客流量数据;

相关代码

运行结果

2)采用列标签实现方式,获取135站点10月1日-10月2日早上9-11点3个时刻的进站客流量数据。

相关代码

运行结果

7.数据框排序

读取股票交易数据表(stkdata.xlsx),完成如下任务:

1)提取600000.SH代码交易数据,并按交易日期从小到大进行排序;

相关代码

运行结果

2)对整个数据表按代码、交易日期从小到大进行排序。

相关代码

运行结果

8.逻辑索引、切片方法,groupby 分组计算函数应用

请读取地铁站点进出站客流数据表(Data.xlsx),完成以下任务:

1)取出第0列,通过去重的方式获得地铁站点编号列表,记为code.

相关代码

运行结果

2)采用数据框中的groupby分组计算函数,统计出每个地铁站点每天的进站人数和出站人数,计算结果采用一个数据框sat_num来表示,其中列标签依次为:站点编号、日期、进站人数和出站人数;

相关代码

运行结果

3)计算出每个站点国庆节期间(10.1~10.7)的进站人数和出站人数, 计算结果用一个数据框sat_num2来表示,其中列标签依次为:A1_站点编号、A2_进站人数、A3_出站人数。

相关代码

运行结果

三、Matplotlib

Matplotlib 是一个用于 Python 语言的绘图库,主要用于创建高质量的数据可视化图形。它是开源的,并且非常流行,在数据分析、科学计算、工程绘图及教育领域有着广泛的应用。

Matplotlib 的定义要点:

  1. 绘图库:Matplotlib 提供了一整套绘制静态、动态和交互式图形的功能,尤其专注于二维数据可视化,同时也支持一些基本的三维图表。

  2. 功能全面:它能够绘制各种类型的图表,包括但不限于折线图(line plots)、散点图(scatter plots)、柱状图(bar charts)、饼图(pie charts)、直方图(histograms)、箱线图(box plots)、等高线图(contour plots)、热力图(heatmap)、3D表面图(3D surface plots)等。

  3. 高度定制化:Matplotlib 允许用户对图形的各种细节进行精细化控制,包括颜色、线型、标记样式、字体、布局、坐标轴、图例、注释、文本标注等。

  4. 兼容性好:可以与其他 Python 库如 NumPy、Pandas 等无缝配合,能够直接处理这些库产生的数据结构,简化数据可视化过程。

  5. 输出形式多样:创建的图表可以保存为多种格式,例如 PNG、JPEG、SVG、PDF 等,也可以显示在交互式环境中,如 Jupyter Notebook 或 GUI 应用程序内。

Matplotlib 的使用领域:

  • 科学研究:科学家在发表论文时经常使用 Matplotlib 来展示实验结果和模拟数据,生成可供出版的质量极高的图形。

  • 数据分析:数据分析人员利用 Matplotlib 来快速探索数据集,揭示数据之间的关系和趋势,辅助做出业务决策。

  • 教育领域:在数学、物理、工程等相关课程的教学中,Matplotlib 被用来清晰地演示数学概念和实验结果。

  • 商业报告:商业智能和市场研究团队会用 Matplotlib 来可视化业务指标、客户行为分析等,以直观的形式展现给管理层或客户。

  • 工程绘图:工程师在处理仿真结果、测量数据或设备性能数据时,可以通过 Matplotlib 进行图形化展示和分析。

总之,Matplotlib 是一个通用性强、适应面广的数据可视化工具,对于任何需要用图形来表达数据含义、解释复杂现象或者交流研究成果的场景,都具有很高的实用价值。

图像类型代码

# 线图 (Line Plots)
plt.plot(x, y) 
#散点图 (Scatter Plots)
plt.scatter(x, y)
#柱状图 (Bar Plots)
plt.bar(categories, values) 
#直方图 (Histogram Plots)
plt.hist(data, bins=30) 
#箱线图 (Box Plots)
plt.boxplot(data, vert=False)  # vert=False 表示水平箱线图  
#饼图 (Pie Charts)
plt.pie(sizes, labels=labels, autopct='%1.1f%%', startangle=140) 
#面积图 (Area Plots)
plt.stackplot(x, [y1, y2], labels=['Y1', 'Y2'])  
plt.legend(loc='upper left')  

各站点各时刻进出站客流数据.xlsx部分数据

站点编号日期时刻进站人数出站人数
1552015-10-0172941215
1552015-10-01811284067
1552015-10-01914413713
1552015-10-011020432976
1552015-10-011126783198
1552015-10-011225152804
1552015-10-011323132396
1552015-10-011417672680
1552015-10-011518732202
1.散点图绘制

读取“各站点各时刻进出站客流数据.xlsx”,绘制站点155各时刻进站客流散点图。

相关代码

import pandas as pd
import matplotlib.pyplot as plt

# 读取数据
data = pd.read_excel("各站点各时刻进出站客流数据.xlsx")
plt.rcParams['font.sans-serif'] = 'SimHei'  # 设置字体为SimHei
plt.rcParams['axes.unicode_minus'] = False  # 解决负号“-”显示异常
"""
(1)散点图绘制
读取“各站点各时刻进出站客流数据.xlsx”,绘制站点155各时刻进站客流散点图。
"""

# 筛选出站点155的数据
site_155_data = data[data["站点编号"] == 155]
# 使用groupby按“时刻”聚合数据,并计算每个时刻的“进站人数”之和
aggregate_data = site_155_data.groupby("时刻")["进站人数"].sum().reset_index()
# 绘制散点图
plt.scatter(aggregate_data["时刻"], aggregate_data["进站人数"])
plt.xlabel("时刻")
plt.ylabel("进站总人数")  # 修改标签为进站总人数
plt.title("站点155各时刻进站客流散点图")  # 修改标题为进站总人数散点图
plt.show()

运行结果

2.线性图绘制

读取“各站点各时刻进出站客流数据.xlsx”,绘制站点157各时刻进站客流线形图。

相关代码

import pandas as pd
import matplotlib.pyplot as plt

# 读取数据
data = pd.read_excel("各站点各时刻进出站客流数据.xlsx")
plt.rcParams['font.sans-serif'] = 'SimHei'  # 设置字体为SimHei
plt.rcParams['axes.unicode_minus'] = False  # 解决负号“-”显示异常
sites = [157]
fig, ax = plt.subplots(figsize=(10, 8))

for i, site in enumerate(sites):
    site_data = data[data["站点编号"] == site]
    total_counts = site_data.groupby("时刻")["进站人数"].sum()
    ax.plot(total_counts.index, total_counts.values)
    ax.set_title(f"站点{site}各时刻进站客流线性图")
    ax.set_xlabel("时刻")
    ax.set_ylabel("总进站人数")

plt.tight_layout()
plt.show()

运行结果

3.柱状图绘制

读取“各站点各时刻进出站客流数据.xlsx”,绘制站点157各时刻进站客流柱状图。

相关代码

import pandas as pd
import matplotlib.pyplot as plt

# 读取数据
data = pd.read_excel("各站点各时刻进出站客流数据.xlsx")
plt.rcParams['font.sans-serif'] = 'SimHei'  # 设置字体为SimHei
plt.rcParams['axes.unicode_minus'] = False  # 解决负号“-”显示异常
# 筛选出站点157的数据
site_157_data = data[data["站点编号"] == 157]

# 使用groupby按“时刻”聚合数据,并计算每个时刻的“进站人数”之和
aggregate_data = site_157_data.groupby("时刻")["进站人数"].sum().reset_index()
# 绘制柱状图
plt.bar(aggregate_data["时刻"], aggregate_data["进站人数"])
plt.xlabel("时刻")
plt.ylabel("进站总人数")  # 修改标签为进站总人数
plt.title("站点157各时刻进站客流柱状图")  # 修改标题为进站总人数柱状图
plt.xticks(rotation=45)  # 如果时刻标签较长,可以旋转x轴标签以便阅读
plt.show()

运行结果

4.直方图绘制

读取“各站点各时刻进出站客流数据.xlsx”,绘制站点157各时刻进站客流直方图。

相关代码

import pandas as pd
import matplotlib.pyplot as plt

# 读取数据
data = pd.read_excel("各站点各时刻进出站客流数据.xlsx")
plt.rcParams['font.sans-serif'] = 'SimHei'  # 设置字体为SimHei
plt.rcParams['axes.unicode_minus'] = False  # 解决负号“-”显示异常
# 筛选出站点157的数据
site_157_data = data[data["站点编号"] == 157]
# 使用groupby按“时刻”聚合数据,并计算每个时刻的“进站人数”之和
aggregate_data = site_157_data.groupby("时刻")["进站人数"].sum().reset_index()
# 绘制直方图
plt.hist(aggregate_data["进站人数"], bins=10)  # 设置bins参数来控制直方图的柱子数量
plt.xlabel("进站总人数")
plt.ylabel("频数")
plt.title("站点157各时刻进站客流直方图")
plt.show()

运行结果

5.饼图绘制

读取 “各站点各时刻进出站客流数据.xlsx”,绘制站点157各时刻进站客流饼图。

相关代码

import pandas as pd
import matplotlib.pyplot as plt

# 读取数据
data = pd.read_excel("各站点各时刻进出站客流数据.xlsx")
plt.rcParams['font.sans-serif'] = 'SimHei'  # 设置字体为SimHei
plt.rcParams['axes.unicode_minus'] = False  # 解决负号“-”显示异常
# 筛选出站点157的数据
site_157_data = data[data["站点编号"] == 157]
# 饼图不适合展示时间序列数据,但可以展示每个时刻进站人数占全天进站人数的比例
pie_data = site_157_data.groupby("时刻")["进站人数"].sum()
plt.pie(pie_data, labels=pie_data.index, autopct="%1.1f%%")
plt.title("站点157各时刻进站客流饼图")
plt.show()

运行结果

6.箱线图绘制

读取“各站点各时刻进出站客流数据.xlsx”,绘制各站点在9时刻进站客流的箱线图。

相关代码

import pandas as pd
import matplotlib.pyplot as plt

# 读取数据
data = pd.read_excel("各站点各时刻进出站客流数据.xlsx")
plt.rcParams['font.sans-serif'] = 'SimHei'  # 设置字体为SimHei
plt.rcParams['axes.unicode_minus'] = False  # 解决负号“-”显示异常
# 筛选9时刻的进站客流数据
nine_am_data = data[(data["时刻"] == 9)][["站点编号", "进站人数"]]

# 按站点编号分组并计算进站人数的列表
station_flows = nine_am_data.groupby("站点编号")["进站人数"].apply(list).to_dict()

# 绘制箱线图
plt.boxplot(station_flows.values(), labels=station_flows.keys())
plt.xlabel("站点编号")
plt.ylabel("进站人数")
plt.title("各站点在9时刻进站客流的箱线图")
plt.show()

运行结果

7.子图绘制

读取“各站点各时刻进出站客流数据.xlsx”,将155、157、151、123四个站点在各时刻的进站客流,用一个2*2的子图,绘制其线性图。

相关代码

import pandas as pd
import matplotlib.pyplot as plt

# 读取Excel文件
df = pd.read_excel('各站点各时刻进出站客流数据.xlsx')
plt.rcParams['font.sans-serif'] = 'SimHei'  # 设置字体为SimHei
plt.rcParams['axes.unicode_minus'] = False  # 解决负号“-”显示异常
# 定义需要绘图的站点编号
stations = [155, 157, 151, 123]
# 初始化子图位置
subplot_positions = [(1, 1), (1, 2), (2, 1), (2, 2)]
# 初始化一个空的字典来存储每个站点的聚合数据
station_data = {}
# 遍历站点列表,对每个站点进行聚合
for station in stations:
    # 筛选出特定站点的数据
    station_df = df[df['站点编号'] == station]
    # 以时刻为索引,对进站人数进行求和
    aggregated_data = station_df.groupby('时刻')['进站人数'].sum().reset_index()
    # 将聚合后的数据存储在字典中
    station_data[station] = aggregated_data
# 绘制2x2子图
fig, axs = plt.subplots(2, 2, figsize=(12, 8))
# 遍历站点和子图位置
for i, (station, data) in enumerate(station_data.items()):
    # 确定子图的位置
    row, col = subplot_positions[i]
    ax = axs[row - 1, col - 1]

    # 绘制线性图
    ax.plot(data['时刻'], data['进站人数'], marker='o', label=f'站点{station}')
    ax.set_xlabel('时刻')
    ax.set_ylabel('总进站人数')
    ax.set_title(f'站点{station}各时刻总进站客流线形图')
    ax.legend()
# 调整子图之间的间距
plt.tight_layout()
# 显示图形
plt.show()

运行结果

四、数据探索

波士顿房价数据集:卡内基梅隆大学收集,StatLib库,1978年,涵盖了麻省波士顿的506个不同郊区的房屋数据。

一共含有506条数据。每条数据14个字段,包含13个属性,和一个房价的平均值。

数据读取方法:

1.请绘制散点图探索波士顿房价数据集中犯罪率(CRIM)和房价中位数(MEDV)之间的相关性。

相关代码

import pandas as pd
import matplotlib.pyplot as plt
names = ['CRIM','ZH','INDUS','CHAS','NOX','RM','GE','DIS','RAD','TAX','PRTATIO','B','LSTAT','MEDV']
data = pd.read_csv("housing.csv",names=names,delim_whitespace=True)

#绘制散点图
plt.rcParams['font.sans-serif'] = 'SimHei'  # 设置字体为SimHei
plt.rcParams['axes.unicode_minus'] = False  # 解决负号“-”显示异常
plt.figure(figsize=(10,8))
plt.scatter(data['CRIM'],data['MEDV'],alpha=0.6,color ='g')
plt.title("波士顿房价CRIM和MEDV之间的相关性",fontsize=18)
plt.xlabel("犯罪率(CRIM)",fontsize=18)
plt.ylabel("房价中位数(MEDV)",fontsize=18)
plt.grid(True)
plt.show()

运行结果

2.请使用波士顿房价数据集中房价中位数(MEDV)来绘制箱线图。

相关代码

import pandas as pd
import matplotlib.pyplot as plt
names = ['CRIM','ZH','INDUS','CHAS','NOX','RM','GE','DIS','RAD','TAX','PRTATIO','B','LSTAT','MEDV']
data = pd.read_csv("housing.csv",names=names,delim_whitespace=True)

plt.rcParams['font.sans-serif'] = 'SimHei'  # 设置字体为SimHei
plt.rcParams['axes.unicode_minus'] = False  # 解决负号“-”显示异常
plt.figure(figsize=(10,8))
# plt.title("波士顿房价CRIM和MEDV之间的相关性",fontsize=18)
# 创建自定义箱线图
plt.boxplot(data['MEDV'], patch_artist=True, showmeans=True,
                 boxprops=dict(facecolor='green', color='green'),  # 设置箱体颜色
                 medianprops=dict(color='red'))  # 设置中位数颜色
plt.title("房价中位数(MEDV)箱线图",fontsize=18)
plt.ylabel("房价中位数(MEDV)",fontsize=18)
plt.grid(True)
plt.show()

运行结果

3.请使用暗点图矩阵探索波士顿房价数据集。

相关代码

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
names = ['CRIM', 'ZH', 'INDUS', 'CHAS', 'NOX', 'RM', 'GE', 'DIS', 'RAD', 'TAX', 'PRTATIO', 'B', 'LSTAT', 'MEDV']
data = pd.read_csv("housing.csv", names=names, delim_whitespace=True)
# 绘制散点图矩阵
plt.rcParams['font.sans-serif'] = 'SimHei'  # 设置字体为SimHei
plt.rcParams['axes.unicode_minus'] = False  # 解决负号“-”显示异常
sns.pairplot(data)
plt.suptitle('波士顿房价散点图矩阵', y=1.05, fontsize=20)
plt.show()

运行结果

4.请分别使用皮尔逊(pearson)、斯皮尔曼(spearman)、肯德尔(kendall)相关系数对犯罪率(CRIM)和房价中位数(MEDV)之间的相关性进行度量。

相关系数计算方法:

相关代码

import pandas as pd
names = ['CRIM', 'ZH', 'INDUS', 'CHAS', 'NOX', 'RM', 'GE', 'DIS', 'RAD', 'TAX', 'PRTATIO', 'B', 'LSTAT', 'MEDV']
data = pd.read_csv("housing.csv", names=names, delim_whitespace=True)
# 计算皮尔逊相关系数
pearson_corr = data['CRIM'].corr(data['MEDV'], method='pearson')
# 计算斯皮尔曼相关系数
spearman_corr = data['CRIM'].corr(data['MEDV'], method='spearman')
# 计算肯德尔相关系数
kendall_corr = data['CRIM'].corr(data['MEDV'], method='kendall')
print("皮尔逊相关系数:", pearson_corr)
print("斯皮尔曼相关系数:", spearman_corr)
print("肯德尔相关系数:", kendall_corr)

运行结果

5.请绘制波士顿房价数据集中各变量之间相关系数的热力图。

需提前安装seaborn库:pip install seaborn

热力图绘制方法:

相关代码

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

names = ['CRIM', 'ZH', 'INDUS', 'CHAS', 'NOX', 'RM', 'GE', 'DIS', 'RAD', 'TAX', 'PRTATIO', 'B', 'LSTAT', 'MEDV']
data = pd.read_csv("housing.csv", names=names, delim_whitespace=True)
# 计算相关系数矩阵
corr_matrix = data.corr()
plt.rcParams['font.sans-serif'] = 'SimHei'  # 设置字体为SimHei
plt.rcParams['axes.unicode_minus'] = False  # 解决负号“-”显示异常
# 绘制热力图
plt.figure(figsize=(10, 8))
sns.heatmap(corr_matrix, annot=True, cmap="coolwarm")
plt.title("波士顿房价数据集中各变量之间的相关系数热力图")
plt.show()

运行结果

五、数据预处理

1.读取“银行贷款审批数据.xlsx”表自变量为x1-x14,决策变量为y(1-同意贷款,0-不同意贷款),自变量中有连续变量(x2,x3,x5,x6,x7,x10,x13,x14)和离散变量(x1,x4,x8,x9,x11,x12),请对连续变量中的缺失值用均值策略填充,对离散变量中的缺失值用最频繁值策略填充。

相关代码

import pandas as pd
# 读取Excel文件
data = pd.read_excel("银行贷款审批数据.xlsx")
# 定义连续变量和离散变量
continuous_vars = ['x2', 'x3', 'x5', 'x6', 'x7', 'x10', 'x13', 'x14']
discrete_vars = ['x1', 'x4', 'x8', 'x9', 'x11', 'x12']
# 对连续变量中的缺失值用均值策略填充
for var in continuous_vars:
    data[var].fillna(data[var].mean(), inplace=True)
# 对离散变量中的缺失值用最频繁值策略填充
for var in discrete_vars:
    data[var].fillna(data[var].mode()[0], inplace=True)
# 输出处理后的数据
print(data)

运行结果

2.请使用StandardScaler对波士顿房价数据集进行零-均值规范化。

相关代码

import pandas as pd
from sklearn.preprocessing import StandardScaler
# 定义数据集的列名
names = ['CRIM', 'ZH', 'INDUS', 'CHAS', 'NOX', 'RM', 'GE', 'DIS', 'RAD', 'TAX', 'PRTATIO', 'B', 'LSTAT', 'MEDV']
# 读取数据
data = pd.read_csv("housing.csv", names=names, delim_whitespace=True)
# 使用StandardScaler对波士顿房价数据集进行零-均值规范化
scaler = StandardScaler()
scaled_data = scaler.fit_transform(data)
# 将规范化后的数据转换回DataFrame格式,方便后续操作
scaled_df = pd.DataFrame(scaled_data, columns=names)
print(scaled_df)

运行结果

3.在上一问规范化后的数据基础上使用PCA对数据进行降维处理(降维后的特征数量为2)。

相关代码

import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
import seaborn as sns
import matplotlib.pyplot as plt
# 定义数据集的列名
names = ['CRIM', 'ZH', 'INDUS', 'CHAS', 'NOX', 'RM', 'GE', 'DIS', 'RAD', 'TAX', 'PRTATIO', 'B', 'LSTAT', 'MEDV']
# 读取数据
data = pd.read_csv("housing.csv", names=names, delim_whitespace=True)
# 使用StandardScaler对波士顿房价数据集进行零-均值规范化
scaler = StandardScaler()
scaled_data = scaler.fit_transform(data)
# 将规范化后的数据转换回DataFrame格式,方便后续操作
scaled_df = pd.DataFrame(scaled_data, columns=names)
# 在规范化后的数据基础上使用PCA对数据进行降维处理(降维后的特征数量为2)
pca = PCA(n_components=2)
pca_data = pca.fit_transform(scaled_df)
# 将降维后的数据转换回DataFrame格式,并添加新的列名
pca_df = pd.DataFrame(pca_data, columns=['PCA_feature_1', 'PCA_feature_2'])
# 打印降维后的数据
print(pca_df)
# 如果你想要查看降维后数据的分布情况,可以使用seaborn绘制散点图
sns.scatterplot(x='PCA_feature_1', y='PCA_feature_2', data=pca_df)
plt.title('PCA Feature Scatterplot')
plt.show()

运行结果

六、

  • 21
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

马龙强_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值