百事通范文网
当前位置 首页 >专题范文 > 公文范文 >

利用Python进行数据分析(第二版)_部分6

发布时间:2022-10-25 18:40:05 来源:网友投稿

下面是小编为大家整理的利用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...

推荐访问:python数据分析心得体会200字 利用Python进行数据分析(第二版)_部分6 利用 分析 数据

Top