Loading... # 实验目的 1. 了解Pandas 模块的数据结构 2. 使用Pandas 对数据进行分析 --- # 实验原理 Python Data Analysis Library 或pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。 --- # 实验要求 提交符合要求的实验报告: 1. 粘贴你补全的代码并注释原因。 2. 将你程序运行的输出结果(图片)粘贴到报告中。 3. 回答STEP6 中:什么是相关系数?和在STEP7 中你发现的规律。 --- # 实验步骤 现在我们获得了一个连续数据的数据集data.txt,该数据集由年,月份,和AB两地某商品的销售数据组成,我们希望发现这两地销售数据之间是否有关联。 ```python import numpy as np import pandas as pd from pandas import DataFrame, Series import matplotlib.pyplot as plt ``` ## STEP1:查看数据集data.txt的数据构成 ```python # 查看数据情况 df = pd.read_table('data.txt', header=None, sep=',') print(df) ```  我们发现其数据有四列构成,分别代表的是年、月、以及两组销售数据。数据是和时间相关联的。因此我们以时间为索引,转换其数据结构将方便我们的分析。 ## STEP2:构建convert_data_to_timeseries函数 ```python 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的(第三列)数据成图 ```python # 文件路径 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() ``` 查看其是否存在某种趋势。   ## STEP4:加入第二组销售数据 ```python ###问题二:将数据的第三,四列转换为二维数据结构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地数据成图 ```python # 将两组数据同时成图 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() ``` 查看两组数据否存在相同趋势。   ## STEP6:借助统计学来观测 ```python ###问题三:请统计两组数组的最大最小值和均值### ###问题三:计算数据的相关系数,调用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:将其相关系数的变化成图 ```python # 打印两组数据相关性 plt.figure() dataframe['A'].rolling(window=60).corr(dataframe['B']).plot() plt.show() ```  # 实验要求3的回答 ## 相关系数 相关系数是最早由统计学家[卡尔·皮尔逊](https://baike.baidu.com/item/%E5%8D%A1%E5%B0%94%C2%B7%E7%9A%AE%E5%B0%94%E9%80%8A)设计的统计指标,是研究变量之间[线性相关](https://baike.baidu.com/item/%E7%BA%BF%E6%80%A7%E7%9B%B8%E5%85%B3/6416511)程度的量,一般用字母 r 表示。由于研究对象的不同,相关系数有多种定义方式,较为常用的是[皮尔逊相关系数](https://baike.baidu.com/item/%E7%9A%AE%E5%B0%94%E9%80%8A%E7%9B%B8%E5%85%B3%E7%B3%BB%E6%95%B0/12712835)。 相关系数是用以反映变量之间相关关系密切程度的统计指标。相关系数是按积差方法计算,同样以两变量与各自[平均值](https://baike.baidu.com/item/%E5%B9%B3%E5%9D%87%E5%80%BC/8353298)的[离差](https://baike.baidu.com/item/%E7%A6%BB%E5%B7%AE/880806)为基础,通过两个离差相乘来反映两变量之间相关程度;着重研究线性的[单相关系数](https://baike.baidu.com/item/%E5%8D%95%E7%9B%B8%E5%85%B3%E7%B3%BB%E6%95%B0/12579133)。 ## STEP7 中发现的规律 A与B在年份中相关性呈现出震荡,同时大部分年间两组数据相关性较低,总体相关性低于0.4,线性关系较弱。 # 备注(源码) ```python #!/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 © 允许规范转载