第7章 数据规整化:清理、转换、合并、重塑(4)

来源:互联网 发布:正在优化social club 编辑:程序博客网 时间:2024/05/21 10:17

第7章 数据规整化:清理、转换、合并、重塑(4)

本章并未给出ldata的来源,可用macrodata.csv转出可用数据。

import pandas as pdimport numpy as npimport datetime   ###后面用到时间处理from pandas import Series,DataFrame###读入macrodata.csv文件data1 = pd.read_csv('E:\pydata-book-2nd-edition\pydata-book-2nd-edition\examples\macrodata.csv') #####选择有用列,其中quarter表示季度,用于合成日期data2 = DataFrame(data1,columns=['year','quarter','realgdp','infl','unemp'])####将季度转为日期,对应关系为:1 = 3.31,2 = 6.30,3 = 9.30,4 = 12.31for i in range(len(data2.index)):    if data2.ix[i,'quarter'] == 1: ####选择DataFrame数据中i行'quarter'列的元素,注意ix[]方括号        data2.ix[i,'date'] = datetime.datetime(int(data2.ix[i,'year']),3,31)        #设置i行新增列'date'的值,时间格式用datetime.datetime(year,month,day)设置,    elif data2.ix[i,'quarter'] == 2:        data2.ix[i,'date'] = datetime.datetime(int(data2.ix[i,'year']),6,30)    elif data2.ix[i,'quarter'] == 3:        data2.ix[i,'date'] = datetime.datetime(int(data2.ix[i,'year']),9,30)    elif data2.ix[i,'quarter'] == 4:        data2.ix[i,'date'] = datetime.datetime(int(data2.ix[i,'year']),12,31)####删除列year、quarter,注意设置axis=1,删除列,默认axis=0,删除行data3 = data2.drop(['year','quarter'],axis=1)####将date列设为索引,书中格式为date独自一列,realgdp/infl/unemp合并一列,所以需要先将独自一列的date设置为索引,避免下一步旋转时,date也被合并进去data4 = data3.set_index('date')###列转为行,形成层次化索引,并为最内侧data5 = data4.stack()###先储存再读取,将索引化为列data5.to_csv('E:\pycode\data\P202.csv')###注意默认读取csv时会将第一行设置为列名,header = None设置没有列名,再用names参数指定列名ldata = pd.read_csv('E:\pycode\data\P202.csv',header = None,names=['date','item','value'])#In [103]:ldata[:10]#Out[103]: #         date     item     value#0  1959-03-31  realgdp  2710.349#1  1959-03-31     infl     0.000#2  1959-03-31    unemp     5.800#3  1959-06-30  realgdp  2778.801#4  1959-06-30     infl     2.340#5  1959-06-30    unemp     5.100#6  1959-09-30  realgdp  2775.488#7  1959-09-30     infl     2.740#8  1959-09-30    unemp     5.300#9  1959-12-31  realgdp  2785.204

长格式旋转为宽格式

时间序列数据通常是以“长格式”或“堆叠格式”存储在数据库中。例如
In [103]:ldata[:10]

date item value 0 1959-03-31 realgdp 1 1959-03-31 infl 2 1959-03-31 unemp 3 1959-06-30 realgdp 4 1959-06-30 infl 5 1959-06-30 unemp 6 1959-09-30 realgdp 7 1959-09-30 infl 8 1959-09-30 unemp 9 1959-12-31 realgdp

这里的长格式即指,相同的date时有4种不同的属性值都列在item内,主键有date和item共同构成,转为宽格式,即把item内的4个属性展开。不同的item值形成一列,date列中的值可以直接做为索引。DataFrame中的pivot方法可以完成转换。

pivoted = ldata.pivot('date','item','value')####第一个参数为ldata中用作行索引的列名,第二个参数为ldata中用作列索引的列名,第三个参数为ldata中用来填充pivoted数据列的列名pivoted.head()###DataFrame.head(n = 5)返回前n行,默认n = 5Out[106]: item        infl   realgdp  unempdate                             1959-03-31  0.00  2710.349    5.81959-06-30  2.34  2778.801    5.11959-09-30  2.74  2775.488    5.31959-12-31  0.27  2785.204    5.61960-03-31  2.31  2847.699    5.2

上述中只有一个参与重塑的数据列,value,假设有两个参与重塑的数据列,value和value2。

ldata['value2'] = np.random.randn(len(ldata))##新增列value2,并用随机数填充###忽略第三个参数可以得到层次化的列,即包含value和value1的值pivoted = ldata.pivot('date','item')pivoted.head()Out[111]:            value                    value2                    item        infl   realgdp unemp      infl   realgdp     unempdate                                                          1959-03-31  0.00  2710.349   5.8  0.292680 -0.699746  0.6685321959-06-30  2.34  2778.801   5.1 -0.457626 -1.274159 -0.1977951959-09-30  2.74  2775.488   5.3 -2.181216 -0.860393  0.1427421959-12-31  0.27  2785.204   5.6  1.532613 -1.294194  0.1276071960-03-31  2.31  2847.699   5.2 -1.383715  0.558345 -0.132973####如果指定,只能得到用其中一种值填充的结果#######且第三个参数只能接受一维的数据,不能同时传入value和value2pivoted = ldata.pivot('date','item','value2')pivoted.head()Out[115]: item            infl   realgdp     unempdate                                    1959-03-31  0.292680 -0.699746  0.6685321959-06-30 -0.457626 -1.274159 -0.1977951959-09-30 -2.181216 -0.860393  0.1427421959-12-31  1.532613 -1.294194  0.1276071960-03-31 -1.383715  0.558345 -0.132973

pivot只是个快捷方法,用第一部分转化的逆过程也可以得到结果。

temp_ldata = ldata.set_index(['date','item'])####设置层次化索引date、item,再旋转item索引可以展开res_ldata = temp_ldata.unstack('item') ###旋转行item为列res_ldata.head()Out[123]:            value                    value2                    item        infl   realgdp unemp      infl   realgdp     unempdate                                                          1959-03-31  0.00  2710.349   5.8  0.292680 -0.699746  0.6685321959-06-30  2.34  2778.801   5.1 -0.457626 -1.274159 -0.1977951959-09-30  2.74  2775.488   5.3 -2.181216 -0.860393  0.1427421959-12-31  0.27  2785.204   5.6  1.532613 -1.294194  0.1276071960-03-31  2.31  2847.699   5.2 -1.383715  0.558345 -0.132973
阅读全文
0 0