@@ -18,7 +18,7 @@ kernelspec:
1818</div>
1919```
2020
21- # {index}` 面板数据的Pandas使用 <single: Pandas for Panel Data>`
21+ # {index}` 用于面板数据处理的Pandas <single: Pandas for Panel Data>`
2222
2323``` {index} single: Python; Pandas
2424```
@@ -33,22 +33,22 @@ kernelspec:
3333
3434计量经济学家经常需要处理更复杂的数据集,比如面板数据。
3535
36- 常见任务包括 :
36+ 常见的任务包括 :
3737
3838* 导入数据、清理数据以及在多个轴上重塑数据。
3939
40- * 从面板数据中选择时间序列或横截面数据 。
40+ * 从面板数据中提取时间序列数据或横截面数据 。
4141* 对数据进行分组和汇总。
4242
43- ` pandas ` (源自'panel'和'data')包含强大且易用的工具,专门用于解决这类问题。
43+ ` pandas ` (源自'panel'和'data'这两个词 )包含强大且易用的工具,专门用于解决这类问题。
4444
4545在接下来的内容中,我们将使用来自OECD的实际最低工资面板数据集来创建:
4646
47- * 数据多个维度的汇总统计
47+ * 数据在多个维度上的汇总统计
4848* 数据集中各国平均最低工资的时间序列
4949* 按大洲划分的工资核密度估计
5050
51- 我们将首先从CSV文件中读取长格式面板数据 ,并使用` pivot_table ` 重塑生成的` DataFrame ` 来构建` MultiIndex ` 。
51+ 首先,我们将从CSV文件中读取长格式面板数据 ,并使用` pivot_table ` 重塑生成的` DataFrame ` 来构建` MultiIndex ` 。
5252
5353使用pandas的` merge ` 函数将为我们的` DataFrame ` 添加额外的详细信息,并使用` groupby ` 函数对数据进行汇总。
5454
@@ -65,7 +65,7 @@ url1 = 'https://raw.githubusercontent.com/QuantEcon/lecture-python/master/source
6565``` {code-cell} ipython3
6666import pandas as pd
6767
68- # 为了查看目的显示6列
68+ # 为便于查看,显示数据集前6列
6969pd.set_option('display.max_columns', 6)
7070
7171# 将小数点位数减少到2位
@@ -80,11 +80,11 @@ realwage = pd.read_csv(url1)
8080realwage.head() # 显示前5行
8181```
8282
83- 数据目前是长格式的,当数据有多个维度时这种格式难以分析 。
83+ 数据目前是长格式的,当数据有多个维度时,使用这种格式难以进行分析 。
8484
85- 我们将使用` pivot_table ` 创建宽格式面板 ,并使用` MultiIndex ` 来处理高维数据。
85+ 我们将使用` pivot_table ` 来创建宽格式面板 ,并使用` MultiIndex ` 来处理高维数据。
8686
87- ` pivot_table ` 的参数需要指定数据 (values)、索引和我们想要在结果数据框中的列 。
87+ ` pivot_table ` 的参数需要指定数据值 (values)、索引和在结果数据框中我们所需的列名 。
8888
8989通过在columns参数中传入一个列表,我们可以在列轴上创建一个` MultiIndex `
9090
@@ -95,16 +95,16 @@ realwage = realwage.pivot_table(values='value',
9595realwage.head()
9696```
9797
98- 为了更容易地过滤我们的时间序列数据 ,接下来我们将把索引转换为` DateTimeIndex `
98+ 为了更容易地筛选我们的时间序列数据 ,接下来我们将把索引转换为` DateTimeIndex `
9999
100100``` {code-cell} ipython3
101101realwage.index = pd.to_datetime(realwage.index)
102102type(realwage.index)
103103```
104104
105- 这些列包含多层级索引,称为 ` MultiIndex ` ,各层级按层次结构排序(国家 > 系列 > 支付周期 )。
105+ 该数据框的列包含多层级索引,被称为 ` MultiIndex ` ,各层级按层次结构排序(Country > Series > Pay period )。
106106
107- ` MultiIndex ` 是在pandas中管理面板数据最简单和最灵活的方式 。
107+ ` MultiIndex ` 是在pandas中管理面板数据最简单且最灵活的方式 。
108108
109109``` {code-cell} ipython3
110110type(realwage.columns)
@@ -114,15 +114,15 @@ type(realwage.columns)
114114realwage.columns.names
115115```
116116
117- 和之前一样,我们可以选择国家(我们的 ` MultiIndex ` 的最高层级 )
117+ 和之前一样,我们可以选择国家(` MultiIndex ` 中的最高层级 )
118118
119119``` {code-cell} ipython3
120120realwage['United States'].head()
121121```
122122
123123在本讲中,我们将经常使用` MultiIndex ` 的堆叠和取消堆叠来将数据框重塑成所需的格式。
124124
125- ` .stack() ` 将列` MultiIndex ` 的最低层级旋转到行索引(` .unstack() ` 的作用方向相反 - 你可以试试看)
125+ ` .stack() ` 将列` MultiIndex ` 的最低层级旋转到行索引(` .unstack() ` 执行反向操作 - 你可以试试看)
126126
127127``` {code-cell} ipython3
128128realwage.stack().head()
@@ -136,23 +136,23 @@ realwage.stack(level='Country').head()
136136
137137使用` DatetimeIndex ` 可以轻松选择特定的时间段。
138138
139- 选择一年并堆叠` MultiIndex ` 的两个较低层级,可以创建我们面板数据的横截面
139+ 选择一年并堆叠` MultiIndex ` 的两个较低层级,可以创建我们面板数据的横截面。
140140
141141``` {code-cell} ipython3
142142realwage.loc['2015'].stack(level=(1, 2)).transpose().head()
143143```
144144
145- 在本讲座剩余部分,我们将使用一个数据框,其中包含不同国家和时间段的每小时实际最低工资数据,以2015年美元计价 。
145+ 在本讲后续内容中,我们将使用按国家和时间维度统计的每小时实际最低工资数据框(计量单位为2015年不变价美元) 。
146146
147- 要创建我们的筛选数据框 (` realwage_f ` ),我们可以使用` xs ` 方法在保持更高层级 (本例中为国家)的同时,选择多重索引中较低层级的值 。
147+ 为了创建筛选后的数据框 (` realwage_f ` ),我们可以使用` xs ` 方法:在保持更高层级索引 (本例中为国家)的同时,选择多级索引中较低层级的值 。
148148
149149``` {code-cell} ipython3
150150realwage_f = realwage.xs(('Hourly', 'In 2015 constant prices at 2015 USD exchange rates'),
151151 level=('Pay period', 'Series'), axis=1)
152152realwage_f.head()
153153```
154154
155- ## 合并数据框和填充空值
155+ ## 合并数据框和填充空值(NaN 值)
156156
157157与SQL等关系型数据库类似,pandas内置了合并数据集的方法。
158158
@@ -179,32 +179,32 @@ worlddata.head()
179179
180180我们想要将新的数据框` worlddata ` 与` realwage_f ` 合并。
181181
182- pandas的` merge ` 函数允许通过行将数据框连接在一起 。
182+ pandas的` merge ` 函数可以通过行将数据框连接在一起 。
183183
184- 我们的数据框将使用国家名称进行合并,这需要我们使用 ` realwage_f ` 的转置,以便两个数据框中的行都对应于国家名称。
184+ 我们的数据框将使用国家名称进行合并,这需要我们使用数据框 ` realwage_f ` 的转置,以便两个数据框中的行都对应于国家名称。
185185
186186``` {code-cell} ipython3
187187realwage_f.transpose().head()
188188```
189189
190- 我们可以使用左连接、右连接、内连接或外连接来合并我们的数据集 :
190+ 我们可以使用左连接(left) 、右连接(right)、内连接(inner)或外连接(outer)来合并我们的数据集 :
191191
192- * 左连接只包含左侧数据集中的国家
193- * 右连接只包含右侧数据集中的国家
194- * 外连接包含左侧和右侧数据集中的任一国家
195- * 内连接只包含左右数据集共有的国家
192+ * 左连接(left)只包含左侧数据集中的国家
193+ * 右连接(right)只包含右侧数据集中的国家
194+ * 内连接(inner)只包含左右数据集共有的国家
195+ * 外连接(outer)包含左侧和右侧数据集中的任一国家
196196
197- 默认情况下,` merge ` 将使用内连接。
197+ 默认情况下,` merge ` 将使用内连接(inner) 。
198198
199- 在这里 ,我们将传入` how='left' ` 以保留` realwage_f ` 中的所有国家,但丢弃在 ` worlddata ` 中没有对应数据项 ` realwage_f ` 的国家 。
199+ 在这个案例中 ,我们将传入` how='left' ` 以保留` realwage_f ` 中的所有国家,但丢弃 ` worlddata ` 中不能和 ` realwage_f ` 相匹配的国家 。
200200
201201这在下图中用红色阴影部分表示
202202
203203``` {figure} /_static/lecture_specific/pandas_panel/venn_diag.png
204204
205205```
206206
207- 我们还需要指定每个数据框中国家名称的位置,这将作为合并数据框的"键"。
207+ 我们还需要指定每个数据框中国家名称的位置,这将作为合并数据框的"键(key) "。
208208
209209我们的"左"数据框(` realwage_f.transpose() ` )在索引中包含国家,所以我们设置` left_index=True ` 。
210210
@@ -226,7 +226,7 @@ merged[merged['Continent'].isnull()]
226226
227227我们有三个缺失值!
228228
229- 处理 NaN 值的一个选项是创建一个包含这些国家及其各自大洲的字典 。
229+ 处理 NaN 值的一个方式是创建一个包含这些国家及其对应大洲的字典 。
230230
231231` .map() ` 将会把 ` merged['Country'] ` 中的国家与字典中的大洲进行匹配。
232232
@@ -240,21 +240,21 @@ missing_continents = {'Korea': 'Asia',
240240merged['Country'].map(missing_continents)
241241```
242242
243- 我们不想用这个映射覆盖整个系列 。
243+ 我们不想用这个映射覆盖整个序列 。
244244
245- ` .fillna() ` 只会用映射填充 ` merged['Continent'] ` 中的 ` NaN ` 值,而保持列中的其他值不变
245+ ` .fillna() ` 只会用映射值填充 ` merged['Continent'] ` 中的 ` NaN ` 值,同时保持列中的其他值不变
246246
247247``` {code-cell} ipython3
248248merged['Continent'] = merged['Continent'].fillna(merged['Country'].map(missing_continents))
249249
250- # 检查大洲是否正确映射
250+ # 检查大洲是否被正确映射
251251
252252merged[merged['Country'] == 'Korea']
253253```
254254
255255我们还要把美洲合并成一个大洲 - 这样可以让我们后面的可视化效果更好看。
256256
257- 为此,我们将使用` .replace() ` 并遍历一个包含我们想要替换的大洲值的列表
257+ 为此,我们将使用` .replace() ` 并遍历一个包含我们想要替换的大洲的值的列表
258258
259259``` {code-cell} ipython3
260260replace = ['Central America', 'North America', 'South America']
@@ -309,7 +309,7 @@ merged.head()
309309merged.mean().head(10)
310310```
311311
312- 使用这个数据系列 ,我们可以绘制数据集中每个国家过去十年的平均实际最低工资
312+ 使用这个数据序列 ,我们可以绘制数据集中每个国家过去十年的平均实际最低工资
313313
314314``` {code-cell} ipython
315315import matplotlib.pyplot as plt
@@ -366,7 +366,7 @@ plt.xlabel('年份')
366366plt.show()
367367```
368368
369- 为了绘图目的 ,我们将去掉澳大利亚这个大洲
369+ 出于绘图目的 ,我们将去掉澳大利亚这个大洲
370370
371371``` {code-cell} ipython3
372372merged = merged.drop('Australia', level='Continent', axis=1)
@@ -377,7 +377,7 @@ plt.xlabel('年份')
377377plt.show()
378378```
379379
380- ` .describe() ` 可以快速获取一些常见的统计摘要数据
380+ ` .describe() ` 可以快速获取一些常见的描述性统计量的汇总结果
381381
382382``` {code-cell} ipython3
383383merged.stack().describe()
@@ -393,14 +393,14 @@ merged.stack().describe()
393393
394394` groupby ` 方法实现了这个过程的第一步,创建一个新的 ` DataFrameGroupBy ` 对象,将数据拆分成组。
395395
396- 让我们再次按大洲拆分 ` merged ` ,这次使用 ` groupby ` 函数,并将结果对象命名为 ` grouped `
396+ 让我们再次按大洲拆分 ` merged ` ,这次使用 ` groupby ` 函数,并将生成的对象命名为 ` grouped `
397397
398398``` {code-cell} ipython3
399399grouped = merged.groupby(level='Continent', axis=1)
400400grouped
401401```
402402
403- 在对象上调用聚合方法会将函数应用于每个组,其结果会被合并到一个新的数据结构中 。
403+ 在对象上调用聚合方法时,该函数会被应用于每个组,运算结果会被合并到一个新的数据结构中 。
404404
405405例如,我们可以使用` .size() ` 返回数据集中每个大洲的国家数量。
406406
@@ -420,25 +420,25 @@ continents = grouped.groups.keys()
420420for continent in continents:
421421 sns.kdeplot(grouped.get_group(continent).loc['2015'].unstack(), label=continent, fill=True)
422422
423- plt.title('Real minimum wages in 2015 ')
423+ plt.title('2015年实际最低工资 ')
424424plt.xlabel('US dollars')
425425plt.legend()
426426plt.show()
427427```
428428
429429## 总结
430430
431- 本讲座介绍了pandas的一些高级特性,包括多重索引 、合并、分组和绘图。
431+ 本讲座介绍了pandas的一些高级特性,包括多级索引 、合并、分组和绘图。
432432
433- 在面板数据分析中可能有用的其他工具包括 [ xarray] ( https://docs.xarray.dev/en/stable/ ) ,这是一个将pandas扩展到N维数据结构的Python包。
433+ 在面板数据分析中,其他可能有用的工具包括 [ xarray] ( https://docs.xarray.dev/en/stable/ ) ,这是一个将pandas扩展到N维数据结构的Python包。
434434
435435## 练习
436436
437437``` {exercise-start}
438438:label: pp_ex1
439439```
440440
441- 在这些练习中,你将使用来自[ Eurostat] ( https://ec.europa.eu/eurostat/data/database ) 的欧洲按年龄和性别划分的就业率数据集 。
441+ 在这些练习中,你将使用来自[ Eurostat] ( https://ec.europa.eu/eurostat/data/database ) 的按年龄和性别划分的欧洲就业率数据集 。
442442
443443可以通过以下链接访问数据集:
444444
@@ -448,7 +448,7 @@ url3 = 'https://raw.githubusercontent.com/QuantEcon/lecture-python/master/source
448448
449449读取 CSV 文件会返回一个长格式的面板数据集。使用 ` .pivot_table() ` 构建一个带有 ` MultiIndex ` 列的宽格式数据框。
450450
451- 首先探索数据框和 ` MultiIndex ` 层级中可用的变量。
451+ 首先探究数据框和 ` MultiIndex ` 层级中可用的变量。
452452
453453编写一个程序,快速返回 ` MultiIndex ` 中的所有值。
454454
@@ -488,9 +488,9 @@ for name in employ.columns.names:
488488:label: pp_ex2
489489```
490490
491- 筛选上述数据框,仅包含以 '活动人口'百分比表示的就业数据。
491+ 筛选上述数据框,仅保留以 '活动人口'百分比表示的就业数据。
492492
493- 使用` seaborn ` 创建一个按年龄组和性别分组的2015年就业率箱线图 。
493+ 使用` seaborn ` 绘制一个按年龄和性别分组的2015年就业率箱线图 。
494494
495495``` {hint}
496496:class: dropdown
@@ -505,14 +505,14 @@ for name in employ.columns.names:
505505:class: dropdown
506506```
507507
508- 为了方便按国家筛选 ,将` GEO ` 调整到最上层并对` MultiIndex ` 进行排序
508+ 为了更方便地按国家筛选 ,将` GEO ` 调整到最上层并对` MultiIndex ` 进行排序
509509
510510``` {code-cell} ipython3
511511employ.columns = employ.columns.swaplevel(0,-1)
512512employ = employ.sort_index(axis=1)
513513```
514514
515- 我们需要删除` GEO ` 中一些不是国家的项目 。
515+ 我们需要删除` GEO ` 中一些不是国家的项 。
516516
517517一个快速去除欧盟地区的方法是使用列表推导式来查找` GEO ` 中以'Euro'开头的层级值。
518518
@@ -523,7 +523,7 @@ employ = employ[countries]
523523employ.columns.get_level_values('GEO').unique()
524524```
525525
526- 从数据框中仅选择活动人口中的就业百分比
526+ 仅选择数据框中活动人口的就业百分比
527527
528528``` {code-cell} ipython3
529529employ_f = employ.xs(('Percentage of total population', 'Active population'),
@@ -532,7 +532,7 @@ employ_f = employ.xs(('Percentage of total population', 'Active population'),
532532employ_f.head()
533533```
534534
535- 在创建分组箱形图之前删除 "总计"值
535+ 在绘制分组箱形图之前删除 "总计"值
536536
537537``` {code-cell} ipython3
538538employ_f = employ_f.drop('Total', level='SEX', axis=1)
@@ -551,4 +551,3 @@ plt.show()
551551
552552``` {solution-end}
553553```
554-
0 commit comments