利用Python进行数据分析(第二版)_部分6
下面是小编为大家整理的利用Python进行数据分析(第二版)_部分6,供大家参考。
多个时间序列数据通常是以所谓的“⻓格式”(long)或“堆叠格式”(stacked)存储在数据库和CSV中的。我们先加载⼀些示例数据,做⼀些时间序列规整和数据清洗:In
[139]:
data
=
pd.read_csv("examples/macrodata.csv")In
[140]:
data.head()Out[140]:
year
quarter
realgdp
realcons
realinv
realgovt
realdpi
cpi
\0
1959.0
1.0
2710.349
1707.4
286.898
470.045
1886.9
28.98
1
1959.0
2.0
2778.801
1733.7
310.859
481.301
1919.7
29.15
2
1959.0
3.0
2775.488
1751.8
289.226
491.260
1916.4
29.35
3
1959.0
4.0
2785.204
1753.7
299.356
484.052
1931.3
29.37
4
1960.0
1.0
2847.699
1770.5
331.722
462.199
1955.5
29.54
m1
tbilrate
unemp
pop
infl
realint
0
139.7
2.82
5.8
177.146
0.00
0.001
141.7
3.08
5.1
177.830
2.34
0.74
2
140.5
3.82
5.3
178.657
2.74
1.09
3
140.0
4.33
5.6
179.386
0.27
4.06
4
139.6
3.50
5.2
180.007
2.31
1.19
In
[141]:
periods
=
pd.PeriodIndex(year=data.year,
quarter=data.quarter,
.....:
name="date")In
[142]:
columns
=
pd.Index(["realgdp",
"infl",
"unemp"],
name="item")In
[143]:
data
=
data.reindex(columns=columns)In
[144]:
data.index
=
periods.to_timestamp("D",
"end")In
[145]:
ldata
=
data.stack().reset_index().rename(columns={0:
"value"})这就是多个时间序列(或者其它带有两个或多个键的可观察数据,这⾥,我们的键是date和item)的⻓格式。表中的每⾏代表⼀次观察。332
关系型数据库(如MySQL)中的数据经常都是这样存储的,因为固定架构(即列名和数据类型)有⼀个好处:随着表中数据的添加,item列中的值的种类能够增加。在前⾯的例⼦中,date和item通常就是主键(⽤关系型数据库的说法),不仅提供了关系完整性,⽽且提供了更为简单的查询⽀持。有的情况下,使⽤这样的数据会很麻烦,你可能会更喜欢DataFrame,不同的item值分别形成⼀列,date列中的时间戳则⽤作索引。DataFrame的pivot⽅法完全可以实现这个转换:In
[147]:
pivoted
=
ldata.pivot("date",
"item",
"value")In
[148]:
pivotedOut[148]:
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.21960-06-30
0.14
2834.390
5.21960-09-30
2.70
2839.022
5.61960-12-31
1.21
2802.616
6.31961-03-31
-0.40
2819.264
6.81961-06-30
1.47
2872.005
7.0...
...
...
...2007-06-30
2.75
13203.977
4.52007-09-30
3.45
13321.109
4.72007-12-31
6.38
13391.249
4.82008-03-31
2.82
13366.865
4.92008-06-30
8.53
13415.266
5.42008-09-30
-3.16
13324.600
6.02008-12-31
-8.79
13141.920
6.92009-03-31
0.94
12925.410
8.12009-06-30
3.37
12901.504
9.22009-09-30
3.56
12990.341
9.6333
[203
rows
x
3
columns]前两个传递的值分别⽤作⾏和列索引,最后⼀个可选值则是⽤于填充DataFrame的数据列。假设有两个需要同时重塑的数据列:In
[149]:
ldata["value2"]
=
np.random.randn(len(ldata))In
[150]:
ldata[:10]Out[150]:
date
item
value
value20
1959-03-31
realgdp
2710.349
0.5237721
1959-03-31
infl
0.000
0.0009402
1959-03-31
unemp
5.800
1.3438103
1959-06-30
realgdp
2778.801
-0.7135444
1959-06-30
infl
2.340
-0.8311545
1959-06-30
unemp
5.100
-2.3702326
1959-09-30
realgdp
2775.488
-1.8607617
1959-09-30
infl
2.740
-0.8607578
1959-09-30
unemp
5.300
0.5601459
1959-12-31
realgdp
2785.204
-1.265934如果忽略最后⼀个参数,得到的DataFrame就会带有层次化的列:In
[151]:
pivoted
=
ldata.pivot("date",
"item")In
[152]:
pivoted[:5]Out[152]:
value
value2
item
infl
realgdp
unemp
infl
realgdp
unempdate
1959-03-31
0.00
2710.349
5.8
0.000940
0.523772
1.3438101959-06-30
2.34
2778.801
5.1
-0.831154
-0.713544
-2.3702321959-09-30
2.74
2775.488
5.3
-0.860757
-1.860761
0.5601451959-12-31
0.27
2785.204
5.6
0.119827
-1.265934
-1.0635121960-03-31
2.31
2847.699
5.2
-2.359419
0.332883
-0.199543334
In
[153]:
pivoted["value"][:5]Out[153]:
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注意,pivot其实就是⽤set_index创建层次化索引,再⽤unstack重塑:In
[154]:
unstacked
=
ldata.set_index(["date",
"item"]).unstack("item")In
[155]:
unstacked[:7]Out[155]:
value
value2
item
infl
realgdp
unemp
infl
realgdp
unempdate
1959-03-31
0.00
2710.349
5.8
0.000940
0.523772
1.3438101959-06-30
2.34
2778.801
5.1
-0.831154
-0.713544
-2.3702321959-09-30
2.74
2775.488
5.3
-0.860757
-1.860761
0.5601451959-12-31
0.27
2785.204
5.6
0.119827
-1.265934
-1.0635121960-03-31
2.31
2847.699
5.2
-2.359419
0.332883
-0.1995431960-06-30
0.14
2834.390
5.2
-0.970736
-1.541996
-1.3070301960-09-30
2.70
2839.022
5.6
0.377984
0.286350
-0.753887将“宽格式”旋转为“⻓格式”旋转DataFrame的逆运算是pandas.melt。它不是将⼀列转换到多个新的DataFrame,⽽是合并多个列成为⼀个,产⽣⼀个⽐输⼊⻓的DataFrame。看⼀个例⼦:In
[157]:
df
=
pd.DataFrame({"key":
["foo",
"bar",
"baz"],335
.....:
"A":
[1,
2,
3],
.....:
"B":
[4,
5,
6],
.....:
"C":
[7,
8,
9]})In
[158]:
dfOut[158]:
A
B
C
key0
1
4
7
foo1
2
5
8
bar2
3
6
9
bazkey列可能是分组指标,其它的列是数据值。当使⽤pandas.melt,我们必须指明哪些列是分组指标。下⾯使⽤key作为唯⼀的分组指标:In
[159]:
melted
=
pd.melt(df,
["key"])In
[160]:
meltedOut[160]:
key
variable
value0
foo
A
11
bar
A
22
baz
A
33
foo
B
44
bar
B
55
baz
B
66
foo
C
77
bar
C
88
baz
C
9使⽤pivot,可以重塑回原来的样⼦:In
[161]:
reshaped
=
melted.pivot("key",
"variable",
"value")In
[162]:
reshapedOut[162]:
336
variable
A
B
Ckey
bar
2
5
8baz
3
6
9foo
1
4
7因为pivot的结果从列创建了⼀个索引,⽤作⾏标签,我们可以使⽤reset_index将数据移回列:In
[163]:
reshaped.reset_index()Out[163]:
variable
key
A
B
C0
bar
2
5
81
baz
3
6
92
foo
1
4
7你还可以指定列的⼦集,作为值的列:In
[164]:
pd.melt(df,
id_vars=["key"],
value_vars=["A",
"B"])Out[164]:
key
variable
value0
foo
A
11
bar
A
22
baz
A
33
foo
B
44
bar
B
55
baz
B
6pandas.melt也可以不⽤分组指标:In
[165]:
pd.melt(df,
value_vars=["A",
"B",
"C"])Out[165]:
variable
value0
A
11
A
22
A
3337
3
B
44
B
55
B
66
C
77
C
88
C
9In
[166]:
pd.melt(df,
value_vars=["key",
"A",
"B"])Out[166]:
variable
value0
key
foo1
key
bar2
key
baz3
A
14
A
25
A
36
B
47
B
58
B
68.4 总结现在你已经掌握了pandas数据导⼊、清洗、重塑,我们可以进⼀步学习matplotlib数据可视化。我们在稍后会回到pandas,学习更⾼级的分析。338
第9章 绘图和可视化信息可视化(也叫绘图)是数据分析中最重要的⼯作之⼀。它可能是探索过程的⼀部分,例如,帮助我们找出异常值、必要的数据转换、得出有关模型的idea等。另外,做⼀个可交互的数据可视化也许是⼯作的最终⽬标。Python有许多库进⾏静态或动态的数据可视化,但我这⾥重要关注于matplotlib(http://matplotlib.org/)和基于它的库。matplotlib是⼀个⽤于创建出版质量图表的桌⾯绘图包(主要是2D⽅⾯)。该项⽬是由John Hunter于2002年启动的,其⽬的是为Python构建⼀个MATLAB式的绘图接⼝。matplotlib和IPython社区进⾏合作,简化了从IPython shell(包括现在的Jupyternotebook)进⾏交互式绘图。matplotlib⽀持各种操作系统上许多不同的GUI后端,⽽且还能将图⽚导出为各种常⻅的⽮量(vector)和光栅(raster)图:PDF、SVG、JPG、PNG、BMP、GIF等。除了⼏张,本书中的⼤部分图都是⽤它⽣成的。随着时间的发展,matplotlib衍⽣出了多个数据可视化的⼯具集,它们使⽤matplotlib作为底层。其中之⼀是seaborn(http://seaborn.pydata.org/),本章后⾯会学习它。学习本章代码案例的最简单⽅法是在Jupyter notebook进⾏交互式绘图。在Jupyter notebook中执⾏下⾯的语句:%matplotlib
notebook9.1 matplotlib API⼊⻔matplotlib的通常引⼊约定是:In
[11]:
import
matplotlib.pyplot
as
plt在Jupyter中运⾏%matplotlib notebook(或在IPython中运⾏%matplotlib),就可以创建⼀个简单的图形。如果⼀切设置正确,会看到图9-1:339
In
[12]:
import
numpy
as
npIn
[13]:
data
=
np.arange(10)In
[14]:
dataOut[14]:
array([0,
1,
2,
3,
4,
5,
6,
7,
8,
9])In
[15]:
plt.plot(data)图9-1 简单的线图虽然seaborn这样的库和pandas的内置绘图函数能够处理许多普通的绘图任务,但如果需要⾃定义⼀些⾼级功能的话就必须学习matplotlib API。笔记:虽然本书没有详细地讨论matplotlib的各种功能,但⾜以将你引⼊⻔。matplotlib的示例库和⽂档是学习⾼级特性的最好资源。Figure和Subplotmatplotlib的图像都位于Figure对象中。你可以⽤plt.figure创建⼀340
个新的Figure:In
[16]:
fig
=
plt.figure()如果⽤的是IPython,这时会弹出⼀个空窗⼝,但在Jupyter中,必须再输⼊更多命令才能看到。plt.figure有⼀些选项,特别是figsize,它⽤于确保当图⽚保存到磁盘时具有⼀定的⼤⼩和纵横⽐。不能通过空Figure绘图。必须⽤add_subplot创建⼀个或多个subplot才⾏:In
[17]:
ax1
=
fig.add_subplot(2,
2,
1)这条代码的意思是:图像应该是2×2的(即最多4张图),且当前选中的是4个subplot中的第⼀个(编号从1开始)。如果再把后⾯两个subplot也创建出来,最终得到的图像如图9-2所示:In
[18]:
ax2
=
fig.add_subplot(2,
2,
2)In
[19]:
ax3
=
fig.add_subplot(2,
2,
3)341
图9-2 带有三个subplot的Figure提示:使⽤Jupyter notebook有⼀点不同,即每个⼩窗重新执⾏后,图形会被重置。因此,对于复杂的图形,,你必须将所有的绘图命令存在⼀个⼩窗⾥。这⾥,我们运⾏同⼀个⼩窗⾥的所有命令:fig
=
plt.figure()ax1
=
fig.add_subplot(2,
2,
1)ax2
=
fig.add_subplot(2,
2,
2)ax3
=
fig.add_subplot(2,
2,
3)如果这时执⾏⼀条绘图命令(如plt.plot([1.5, 3.5, -2, 1.6])),matplotlib就会在最后⼀个⽤过的subplot(如果没有则创建⼀个)上进⾏绘制,隐藏创建figure和subplot的过程。因此,如果我们执⾏下列命令,你就会得到如图9-3所示的结果:In
[20]:
plt.plot(np.random.randn(50).cumsum(),
"k--")图9-3 绘制⼀次之后的图像342
"k--"是⼀个线型选项,⽤于告诉matplotlib绘制⿊⾊虚线图。上⾯那些由fig.add_subplot所返回的对象是AxesSubplot对象,直接调⽤它们的实例⽅法就可以在其它空着的格⼦⾥⾯画图了,如图9-4所示:In
[21]:
_
=
ax1.hist(np.random.randn(100),
bins=20,
color="k",
alpha=0.3)In
[22]:
ax2.scatter(np.arange(3...
版权声明:
1.世霆文库网的资料来自互联网以及用户的投稿,用于非商业性学习目的免费阅览。
2.《利用Python进行数据分析(第二版)_部分6》一文的著作权归原作者所有,仅供学习参考,转载或引用时请保留版权信息。
3.如果本网所转载内容不慎侵犯了您的权益,请联系我们,我们将会及时删除。