实验目的
- 了解Pandas 模块的数据结构
- 使用Pandas 对数据进行分析
实验原理
Python Data Analysis Library 或pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。
实验要求
提交符合要求的实验报告:
- 粘贴你补全的代码并注释原因。
- 将你程序运行的输出结果(图片)粘贴到报告中。
- 回答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)
我们发现其数据有四列构成,分别代表的是年、月、以及两组销售数据。数据是和时间相关联的。因此我们以时间为索引,转换其数据结构将方便我们的分析。
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()
查看其是否存在某种趋势。
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()
查看两组数据否存在相同趋势。
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()
实验要求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()