实验目的

  1. 了解Pandas 模块的数据结构
  2. 使用Pandas 对数据进行分析

实验原理

Python Data Analysis Library 或pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。


实验要求

提交符合要求的实验报告:

  1. 粘贴你补全的代码并注释原因。
  2. 将你程序运行的输出结果(图片)粘贴到报告中。
  3. 回答STEP6 中:什么是相关系数?和在STEP7 中你发现的规律。

实验步骤

现在我们获得了一个连续数据的数据集data.txt,该数据集由年,月份,和AB两地某商品的销售数据组成,我们希望发现这两地销售数据之间是否有关联。

import numpy as np
import pandas as pd
from pandas import DataFrame, Series
import matplotlib.pyplot as plt

STEP1:查看数据集data.txt的数据构成

# 查看数据情况
df = pd.read_table('data.txt', header=None, sep=',')
print(df)

img_1.png

我们发现其数据有四列构成,分别代表的是年、月、以及两组销售数据。数据是和时间相关联的。因此我们以时间为索引,转换其数据结构将方便我们的分析。

STEP2:构建convert_data_to_timeseries函数

def convert_data_to_timeseries(input_file, column, verbose=False):
    # 导入数据
    data = np.loadtxt(input_file, delimiter=',')
    # 确定索引的开始与结束时间
    start_date = str(int(data[0, 0])) + '-' + str(int(data[0, 1]))
    end_date = str(int(data[-1, 0] + 1)) + '-' + str(int(data[-1, 1] % 12 + 1))
    ###问题一:完善函数###
    ###提示:通过pandas的date_range函数获取索引###
    index = pd.date_range(start=start_date, end=end_date, freq='MS', closed='left')
    data_timeseries = Series(data[:, column], index=index)

    return data_timeseries

该函数目的是将原始数据中的某地销售数据转换为Series结构,其索引为年月构成的时间,因为Series强大的功能方便我们进行统计。

STEP3:将A的(第三列)数据成图

# 文件路径
input_file = 'data.txt'
column_num = 2
a = convert_data_to_timeseries(input_file, column_num)
# Plot方法成图
plt.plot(a)
plt.title('Input data')
plt.show()
# 图像太密集了,我们换一个时间范围
start = '2007-2'
end = '2007-11'
plt.figure()
a[start:end].plot()
plt.title('Data from ' + start + ' to ' + end)
plt.show()

查看其是否存在某种趋势。

img_2.png

img_3.png

STEP4:加入第二组销售数据

###问题二:将数据的第三,四列转换为二维数据结构dataframe,索引为时间###
b = convert_data_to_timeseries('data.txt', 3)
series = pd.concat([a,b], axis=1)
dataframe = DataFrame(series)
dataframe.columns = ['A', 'B']
print(dataframe)

将两组Series数据转化为二维数据结构DataFrame,索引为时间,DataFrame结构会利于我们的比较。

STEP5:将AB地数据成图

# 将两组数据同时成图
dataframe['1955':'1960'].plot()
plt.title('Data overlapped on top of each other')
# 查看两组数据是否有线性关联
plt.figure()
difference = dataframe['1952':'1955']['A'] - dataframe['1952':'1955']['B']
difference.plot()
plt.title('Difference (A - B)')
plt.show()

查看两组数据否存在相同趋势。

img_4.png

img_5.png

STEP6:借助统计学来观测

###问题三:请统计两组数组的最大最小值和均值###
###问题三:计算数据的相关系数,调用corr函数###
print("min:\n", dataframe.min(axis=0))
print( "max:\n", dataframe.max(axis=0))
print("mean\n", dataframe.mean(axis=0))
data_corr = dataframe.corr(method ='pearson')
print("corr:\n", data_corr)

分别计算两组数据的最大最小值,平均值,以及相关系数

img_6.png

STEP7:将其相关系数的变化成图

# 打印两组数据相关性
plt.figure()
dataframe['A'].rolling(window=60).corr(dataframe['B']).plot()
plt.show()

img_7.png

实验要求3的回答

相关系数

相关系数是最早由统计学家卡尔·皮尔逊设计的统计指标,是研究变量之间线性相关程度的量,一般用字母 r 表示。由于研究对象的不同,相关系数有多种定义方式,较为常用的是皮尔逊相关系数

相关系数是用以反映变量之间相关关系密切程度的统计指标。相关系数是按积差方法计算,同样以两变量与各自平均值离差为基础,通过两个离差相乘来反映两变量之间相关程度;着重研究线性的单相关系数

STEP7 中发现的规律

A与B在年份中相关性呈现出震荡,同时大部分年间两组数据相关性较低,总体相关性低于0.4,线性关系较弱。

备注(源码)

#!/usr/bin/env python
# coding: utf-8

# In[1]:


import numpy as np
import pandas as pd
from pandas import DataFrame, Series
import matplotlib.pyplot as plt


# In[2]:


###STEP2###
def convert_data_to_timeseries(input_file, column, verbose=False):
    # 导入数据
    data = np.loadtxt(input_file, delimiter=',')
    # 确定索引的开始与结束时间
    start_date = str(int(data[0, 0])) + '-' + str(int(data[0, 1]))
    end_date = str(int(data[-1, 0] + 1)) + '-' + str(int(data[-1, 1] % 12 + 1))
    ###问题一:完善函数###
    ###提示:通过pandas的date_range函数获取索引###
    index = pd.date_range(start=start_date, end=end_date, freq='MS', closed='left')
    data_timeseries = Series(data[:, column], index=index)

    return data_timeseries


# In[3]:


if __name__ == '__main__':
    ###STEP1###
    # 查看数据情况
    df = pd.read_table('data.txt', header=None, sep=',')
    print(df)
    ###STEP3###
    # 文件路径
    input_file = 'data.txt'
    column_num = 2
    a = convert_data_to_timeseries(input_file, column_num)
    plt.plot(a)
    plt.title('Input data')
    plt.show()
    # 图像太密集了,我们换一个时间范围
    start = '2007-2'
    end = '2007-11'
    plt.figure()
    a[start:end].plot()
    plt.title('Data from ' + start + ' to ' + end)
    plt.show()
    ###STEP4###
    ###问题二:将数据的第三,四列转换为二维数据结构dataframe,索引为时间###
    b = convert_data_to_timeseries('data.txt', 3)
    series = pd.concat([a, b], axis=1)
    dataframe = DataFrame(series)
    dataframe.columns = ['A', 'B']
    print(dataframe)
    ###STEP5###
    # 将两组数据同时成图
    dataframe['1955':'1960'].plot()
    plt.title('Data overlapped on top of each other')
    plt.legend(['first', 'second'])
    plt.show()
    # 查看两组数据是否有线性关联
    plt.figure()
    difference = dataframe['1952':'1955']['A'] - dataframe['1952':'1955']['B']
    difference.plot()
    plt.title('Difference (A - B)')
    plt.show()
    ###STEP6###
    ###问题三:请统计两组数组的最大最小值和均值###
    ###问题三:计算数据的相关系数,调用corr函数###
    print("min:\n", dataframe.min(axis=0))
    print("max:\n", dataframe.max(axis=0))
    print("mean\n", dataframe.mean(axis=0))
    data_corr = dataframe.corr(method='pearson')
    print("corr:\n", data_corr)
    ###STEP7###
    # 打印两组数据相关性
    plt.figure()
    dataframe['A'].rolling(window=60).corr(dataframe['B']).plot()
    plt.show()
最后修改:2021 年 12 月 14 日 08 : 28 PM