Skip to content

Commit 7b98558

Browse files
authored
[pandas_panel] Translation Update
1 parent 2fd1dd1 commit 7b98558

1 file changed

Lines changed: 50 additions & 51 deletions

File tree

lectures/pandas_panel.md

Lines changed: 50 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -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
6666
import pandas as pd
6767
68-
# 为了查看目的显示6列
68+
# 为便于查看,显示数据集前6列
6969
pd.set_option('display.max_columns', 6)
7070
7171
# 将小数点位数减少到2位
@@ -80,11 +80,11 @@ realwage = pd.read_csv(url1)
8080
realwage.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',
9595
realwage.head()
9696
```
9797

98-
为了更容易地过滤我们的时间序列数据,接下来我们将把索引转换为`DateTimeIndex`
98+
为了更容易地筛选我们的时间序列数据,接下来我们将把索引转换为`DateTimeIndex`
9999

100100
```{code-cell} ipython3
101101
realwage.index = pd.to_datetime(realwage.index)
102102
type(realwage.index)
103103
```
104104

105-
这些列包含多层级索引,称为`MultiIndex`,各层级按层次结构排序(国家 > 系列 > 支付周期)。
105+
该数据框的列包含多层级索引,被称为`MultiIndex`,各层级按层次结构排序(Country > Series > Pay period)。
106106

107-
`MultiIndex`是在pandas中管理面板数据最简单和最灵活的方式
107+
`MultiIndex`是在pandas中管理面板数据最简单且最灵活的方式
108108

109109
```{code-cell} ipython3
110110
type(realwage.columns)
@@ -114,15 +114,15 @@ type(realwage.columns)
114114
realwage.columns.names
115115
```
116116

117-
和之前一样,我们可以选择国家(我们的`MultiIndex`的最高层级
117+
和之前一样,我们可以选择国家(`MultiIndex`中的最高层级
118118

119119
```{code-cell} ipython3
120120
realwage['United States'].head()
121121
```
122122

123123
在本讲中,我们将经常使用`MultiIndex`的堆叠和取消堆叠来将数据框重塑成所需的格式。
124124

125-
`.stack()`将列`MultiIndex`的最低层级旋转到行索引(`.unstack()`的作用方向相反 - 你可以试试看)
125+
`.stack()`将列`MultiIndex`的最低层级旋转到行索引(`.unstack()`执行反向操作 - 你可以试试看)
126126

127127
```{code-cell} ipython3
128128
realwage.stack().head()
@@ -136,23 +136,23 @@ realwage.stack(level='Country').head()
136136

137137
使用`DatetimeIndex`可以轻松选择特定的时间段。
138138

139-
选择一年并堆叠`MultiIndex`的两个较低层级,可以创建我们面板数据的横截面
139+
选择一年并堆叠`MultiIndex`的两个较低层级,可以创建我们面板数据的横截面
140140

141141
```{code-cell} ipython3
142142
realwage.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
150150
realwage_f = realwage.xs(('Hourly', 'In 2015 constant prices at 2015 USD exchange rates'),
151151
level=('Pay period', 'Series'), axis=1)
152152
realwage_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
187187
realwage_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',
240240
merged['Country'].map(missing_continents)
241241
```
242242

243-
我们不想用这个映射覆盖整个系列
243+
我们不想用这个映射覆盖整个序列
244244

245-
`.fillna()` 只会用映射填充 `merged['Continent']` 中的 `NaN` 值,而保持列中的其他值不变
245+
`.fillna()` 只会用映射值填充 `merged['Continent']` 中的 `NaN` 值,同时保持列中的其他值不变
246246

247247
```{code-cell} ipython3
248248
merged['Continent'] = merged['Continent'].fillna(merged['Country'].map(missing_continents))
249249
250-
# 检查大洲是否正确映射
250+
# 检查大洲是否被正确映射
251251
252252
merged[merged['Country'] == 'Korea']
253253
```
254254

255255
我们还要把美洲合并成一个大洲 - 这样可以让我们后面的可视化效果更好看。
256256

257-
为此,我们将使用`.replace()`并遍历一个包含我们想要替换的大洲值的列表
257+
为此,我们将使用`.replace()`并遍历一个包含我们想要替换的大洲的值的列表
258258

259259
```{code-cell} ipython3
260260
replace = ['Central America', 'North America', 'South America']
@@ -309,7 +309,7 @@ merged.head()
309309
merged.mean().head(10)
310310
```
311311

312-
使用这个数据系列,我们可以绘制数据集中每个国家过去十年的平均实际最低工资
312+
使用这个数据序列,我们可以绘制数据集中每个国家过去十年的平均实际最低工资
313313

314314
```{code-cell} ipython
315315
import matplotlib.pyplot as plt
@@ -366,7 +366,7 @@ plt.xlabel('年份')
366366
plt.show()
367367
```
368368

369-
为了绘图目的,我们将去掉澳大利亚这个大洲
369+
出于绘图目的,我们将去掉澳大利亚这个大洲
370370

371371
```{code-cell} ipython3
372372
merged = merged.drop('Australia', level='Continent', axis=1)
@@ -377,7 +377,7 @@ plt.xlabel('年份')
377377
plt.show()
378378
```
379379

380-
`.describe()` 可以快速获取一些常见的统计摘要数据
380+
`.describe()` 可以快速获取一些常见的描述性统计量的汇总结果
381381

382382
```{code-cell} ipython3
383383
merged.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
399399
grouped = merged.groupby(level='Continent', axis=1)
400400
grouped
401401
```
402402

403-
在对象上调用聚合方法会将函数应用于每个组,其结果会被合并到一个新的数据结构中
403+
在对象上调用聚合方法时,该函数会被应用于每个组,运算结果会被合并到一个新的数据结构中
404404

405405
例如,我们可以使用`.size()`返回数据集中每个大洲的国家数量。
406406

@@ -420,25 +420,25 @@ continents = grouped.groups.keys()
420420
for 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年实际最低工资')
424424
plt.xlabel('US dollars')
425425
plt.legend()
426426
plt.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
511511
employ.columns = employ.columns.swaplevel(0,-1)
512512
employ = employ.sort_index(axis=1)
513513
```
514514

515-
我们需要删除`GEO`中一些不是国家的项目
515+
我们需要删除`GEO`中一些不是国家的项
516516

517517
一个快速去除欧盟地区的方法是使用列表推导式来查找`GEO`中以'Euro'开头的层级值。
518518

@@ -523,7 +523,7 @@ employ = employ[countries]
523523
employ.columns.get_level_values('GEO').unique()
524524
```
525525

526-
从数据框中仅选择活动人口中的就业百分比
526+
仅选择数据框中活动人口的就业百分比
527527

528528
```{code-cell} ipython3
529529
employ_f = employ.xs(('Percentage of total population', 'Active population'),
@@ -532,7 +532,7 @@ employ_f = employ.xs(('Percentage of total population', 'Active population'),
532532
employ_f.head()
533533
```
534534

535-
在创建分组箱形图之前删除"总计"值
535+
在绘制分组箱形图之前删除"总计"值
536536

537537
```{code-cell} ipython3
538538
employ_f = employ_f.drop('Total', level='SEX', axis=1)
@@ -551,4 +551,3 @@ plt.show()
551551

552552
```{solution-end}
553553
```
554-

0 commit comments

Comments
 (0)