ADM-201 dump PMP dumps pdf SSCP exam materials CBAP exam sample questions

#3 数据清洗 – 译学馆
未登录,请登录后再发表信息
最新评论 (0)
播放视频

#3 数据清洗

Data Analysis 3: Cleaning Data - Computerphile

Well, we’re looking at chocolate datasets today,
我们今天看关于巧克力的数据集
so I thought I’d bring some research.
我带来了一些用于研究
Yeah, good and definitely relevant
嗯 味道不错 且绝对和主题相关
<03 - 数据清洗>
<数据狂热>
We’ve been looking at techniques like data visualization
我们一直在研究像数据可视化这样的技术
to try and explore our data
来试着探索我们的数据
and start to draw some initial, you know, conclusions or hypotheses
并尝试得出一些初始的结论或假设
We’re going to start to move towards kind of modeling our data
现在开始 我们将对数据进行建模
and actually trying to extract proper knowledge from this data
并尝试从这些数据中提取正确的信息
because remember just because we’ve got data
仅仅拥有数据 并不意味着我们
doesn’t mean we’ve got knowledge.
能得到有用的信息
Now this is going to be a kind of iterative process.
接下来我要讲的是一个迭代过程
We’re going to need to clean up our data
我们需要清理我们的数据
to make it as useful as possible
尽可能提高其可用性
We need to transform it
我们需要转换数据
so that we can combine datasets together
这样我们才能连接数据集
And statistically measure our datasets.
还需要统计测量我们的数据集
And then we’re going to need to reduce it sometimes
有时数据集太大且不好管理
if our data set is too big and unmanageable.
我们还要做数据归约
and this combination of cleaning data
这种数据清洗
and transforming data and reducing data
数据转换 及数据归约的组合
is a kind of cycle where we’re going to iterate this until
是一个循环 我们需要不断迭代操作
our dataset, is a smallest most useful form it can be
直到数据集变成最精简和最有用的形式
So if we’ve got redundant variables
有时候会存在冗余的变量
which are basically the same as others
即它们跟其他变量基本是重复的
or we’ve got duplicates
或是完全重复
These are all problems that we need to sort out.
这些都是需要解决的问题
Because if we’re going to be analyzing data with these kinds of issues,
因为如果带着这些问题来分析数据
we’re just making our life slightly more difficult.
那只会让分析过程更困难
It’s computationally inefficient,
这样计算效率很低
and you know, in the worst case,
且在最坏的情况下
we could draw the wrong conclusions.
还可能得出错误的结论
You might be surprised and disappointed
当你刚开始拿到数据集时
when you get your first dataset
你可能会惊讶和失望
that actually it’s not quite as nice as you were hoping right
因为它没有你想象的那么好
It’s gonna need some cleaning up.
我们需要做数据清洗
Maybe there’s missing values
可能缺失了某些值
Maybe there’s outliers that need to be dealt with
也可能要处理异常值
because this yeah they’re warping your distributions and your and your medians and means
因为它们会扭曲数据分布 中值和均值
And perhaps you also got noise in your dataset, right
也许你还会碰到数据噪声 对吧?
these few things we can start to address with cleaning
我们可以通过数据清洗来解决这些问题
So cleaning data is essentially the idea of
因此 数据清洗的本质是
trying to correct or fill in any missing values
试着修正或填补缺失值
Or remove those bits completely.
或是完全删除那些数据位
You might be surprised that it’s missing data at all
你可能感到惊讶 居然会遗漏数据
I mean oh, what, are we not paying attention?
我的意思是 哦 难道我们那么不小心吗?
Like we’ve got one job and that was to collect the data
我们只有一项工作 那就是收集数据
and we seem to have got missing data
而我们似乎遗漏了数据
But actually it’s quite common
但这实际上很正常
because I mean, for example if you’re
因为比如你要
if you’re trying to track patient records over time
你要长时间跟踪患者记录
Maybe we didn’t show up to an appointment
也许我们失约了
or maybe you in a hospital when they weren’t there
或是他们需要测量体温时
when they needed to have their temperature taken
你在医院 他们却不在
right and then your trend line of your temperature
然后随着时间的推移
over time is going to be missing some values
你所记录的温度趋势线将丢失一些值
Maybe you’ve got data going back for hundreds of years
也许你有之前数百年的数据
and they didn’t have certain techniques
那时他们还没有某些技术
and certain measurement systems back then
和某些测量系统
so they only have other kinds of data
所以他们只有其它类型的数据
so missing data is very common.
所以遗漏数据是很正常的
We’re gonna have to be able to deal with it.
我们只需要知道怎么来处理
So the dataset we’re looking at today is a kind of ratings for chocolate bars.
我们今天要看的 是关于巧克力棒评分的数据集
This is why I ate my chocolate
这就是为什么我开头在吃巧克力
or at least that’s why I’m telling myself
至少我是这样告诉自己的
So we’ll read the data in
我们来读取数据
we’ve got ten different variables
共有十个变量
We’ve got about 1,700 nearly observations
有大约1700个观察值
and let’s have a quick look using the summary
我们用摘要函数快速浏览一下
So we’ve got things like the company who produce the chocolate,
我们可以看到例如巧克力的制作公司
the name of the chocolate
巧克力的名称
reviews, the cocoa percentage,
评论 可可百分比
the type of bean, this kind of information
可可豆种类 之类的信息
Right and you can imagine what you might do if you were trying to produce better chocolate
可以想象 如果你想生产出更好的巧克力
is a look at a huge amount of this kind of data
你会需要研究非常大量的数据
and work out what it is that customers like and what it is they don’t like
从而弄清客户喜欢什么 不喜欢什么
Right this is going to be quite common in market research
这在市场调研中是非常普遍的
So the first thing we’re going to do
我们要做的第一件事
Right, we’ve received this data
是的我们已经有数据了
We know now what the columns are,
我们现在知道有哪些列
but we don’t really know anything else other than this
但除此之外我们一无所知
So we’re going to have to start looking through and seeing first of all,
因此 首先我们必须仔细看看
is there any missing data?
是否有缺失的数据?
So we’re going to use the sapply function for this
我们将使用sapply函数
The sapply function
sapply函数
will apply a function over our dataset
将把某个函数运用到整个数据集上
so for each column or each attribute of our data we’re going to apply this
它的对象是数据的每个列或属性
And the function we’re going to use we’re writing ourselves
我们将自己定义这个将被运用的函数
So it’s going to be the sum for anytime where our item is either blank or na
我们定义 当数据单元为空或为NA时
Now blank means an empty string and na means literally not applicable
为空意味着空的字符串 NA意味着缺失值
Right, which is something that comes up in data from time to time
这些都时不时会出现在数据中
Alright, so in any case both of these are missing values,
总而言之 这些都是缺失的数据
so we’re going to treat them both the same
我们会用同样的方式处理它们
So if we apply this to our chocolate dataset
如果把这个函数运用到巧克力数据集
then we’re going to see that for example,
可以看到 例如
there are eight missing names
缺少了八个名字
There are seven missing review dates,
还缺少了七个审核日期
and there are four missing coco percentages
以及四个可可含量百分比
So for each row in our data,
从行的角度看
there are four rows where the Coco percent is missing, right
共有四行数据缺少可可百分比信息
That’s not too bad, four, I mean,
四个还不错 我的意思是
this is a dataset of nearly 1,700 items.
它总共有近1700个数据单元
Four is not too bad.
只缺四个不算多
That’s quite quite expected
和预期的一样
You might imagine that
可以想象
if you’re pooling this data from lots of different sources
如果这些数据是你从不同渠道获取的
People are going to forget to add data in,
人们可能会忘记添加新数据
or they weren’t able to record data on that day
或者某天他们无法记录数据
There’s a huge amount of reasons why you might have missing data.
造成数据缺失的可能有很多
And now it starts to become a little bit of a problem
但当看到可可豆种类时
when we look at things like bean type.
问题有点严重了
Because bean type has got 1,200 missing values
因为它有1200个缺失值
That’s a huge proportion of a dataset.
它占了数据集的很大一部分
And in that case
在这种情况下
we might have to do something about this.
我们可能需要对此进行处理
So the only issue we’ve got is that 1200 is not relat… It’s just an amount of rows.
这里的问题是 1200是行数
It’s not relative to the size of the dataset.
它与数据集的大小无关
So we’re going to use the exact same function any empty rows
接下来我们会用同样的函数
but this time we’re going to divide by the total number of rows
但是这次我们要除以总行数
so we can get a percentage for how much of a missing data we’ve got.
这样就能算出缺失数据的百分比
So we can see for example that company name
比如可以看到公司名称
has zero missing data,
没有缺失任何数据
whereas bean type has 74 percent missing data.
而可可豆种类缺少的数据则占74%
So that’s a huge problem
这问题比较严重
Now a kind of general rule of thumb is
根据一般的经验
if you’ve got over half your data is missing
如果你缺少了一半以上的数据
it’s going to be quite hard to estimate or guess what that data is going to be
你就很难估计或猜测缺失的数据是什么
That’s when you might want to start thinking about removing it.
你可能需要考虑将它完全剔除
So what we want to do is we want to extract any of the names of any of our attributes
所以我们要做的是提取出属性的名字
that have this sort of over let’s say 60% missing.
条件是属性缺少超过60%的数据
So we’re going to start by calculating all the percentages
所以我们先计算出所有属性的百分比
and saving them in a variable.
并将其保存在变量中
And then we’re going to select only those percentages, where the value is over point six, right?
然后只把所有超过0.6的百分比选出来
60 percent.
即超过60%
So we’re gonna say any attribute where the attribute is over point six
我们输入 查找百分比超过0.6的属性
and that is just bean type at point seven four.
结果仅返回了 可可豆种类 0.74
Or seventy four percent.
或说74%
So we can now delete bean type ourselves
现在我们手动删除可可豆种类
so we could say something like choco all the rows
对巧克力数据集的所有行进行处理
for bean type is null
可可豆种类为空
by setting that to null, that’s just going to delete that column
将其设为空 可以删除对应的数据列
We can also do it automatically
我们也可以自动操作
so we could actually pass in
实际上我们可以传参
those attributes that we just calculated as a parameter
用刚计算出的那些属性作为参数
So that would be this line here
是这行代码
So it’ll be something like choco, all rows, that’s here,
找到巧克力数据集中所有符合条件的行 在这里
the names of any attributes where the percentage missing is greater than 0.6.
条件是缺失超过60%的数据属性
And that’s going to just delete bean type.
这就可以删除可可豆种类
There’s not a lot we can do about bean type.
对于它 我们能做的不多
We’ve only got 25%-ish of the data.
我们只有25%左右的数据
It’s not enough to start guessing
数量太少 我们无法猜测
what bean types are going to be in other chocolate bars.
其他巧克力棒的可可豆种类
Let’s have a look at now our rows of data.
现在来看看我们的数据
For each instance they’re going to have a number of attributes,
每一个实例都会有一些对应的属性
now there’s nine left.
现在还剩九个
And we want really to keep the instances that have the majority of their data, right
我们希望能保留含有大部分数据的实例
So we’re gonna apply, right, so this is going to be row wise
我们会对所有行进行处理
to dimension one, so that’s the rows
输入1 代表行
we’re gonna count any of a blank or n/a
计算每一行中 为空或NA的
for each row over our dataset,
数据单元数量
and we’re going to put this into missing
把它们标记成缺失
So what it is going to do is return a list of values of every single row
这会返回一个列表
that tells you how many missing items are there in that row.
它会告诉你数据行里缺少了多少数据
So we can now look at the first few missing items.
我们来看看开头的几个缺失值
So we’re going to order them, right, by larges first
把它们从大到小进行排序
And then we’re going to show just the first few.
我们只看开头的这几个
And you can see that actually some of them are missing seven and six attributes.
可以看到 有些行缺了7个属性 有些缺了6个
That’s quite a serious situation
这问题比较严重
Because it was only nine, right.
因为总共就只有九个属性
So eventually they’ve only got a couple of entries in their fields.
这意味着它们缺失了大部分的信息
Now let’s do this again as a percentage of the number of attributes
现在我们来算缺失的百分比
So this is exactly the same thing
步骤是一样的
but this time we’re dividing by the number of columns,
但这次我们将除以列数
which is nine.
是9
and we’re going to have a look at the top of these.
来看最开头的这几个
and so you can see that we’re missing 77% of some of these initial attributes,
可以看到我们缺了77%的属性
That’s a real problem.
问题很严重
Missing is the same length as the number of rows we’ve got.
缺失的长度与我们得到的行数相同
So we can actually look up any rows
因此我们可以选取出所有
where there’s a greater percentage of missing values that we want
缺失百分比很高的行
and just remove them from the dataset.
并把它们从数据集中删除
So what we’re going to do that is a bit like this.
我们这么来操作
We can say choco is choco, anywhere where
我们对巧克力数据集的所有行进行操作
missing is less than null point seven and then all the columns.
选取那些缺失百分比小于77%的行
And what that’s going to do is select only the rows we want
这可以让我们只保留那些
where they’ve got a nice amount of data.
有大部分数据的行
So the choco dataset is going to be a little bit smaller now, but much more useful to us
现在数据集变小了 但其有用性也提高了
We don’t really want to be trying to do things like machine learning or statistics
我们并不想对缺失70%的数据集
when 70% of some of the data is missing.
进行机器学习或统计分析
Right, that isn’t going to be a good idea.
是的 那不是个好主意
So it’s quite easy just to delete data, right?
可以看到 删除数据非常容易 对吧?
I mean in some sense, it’s just more convenient to do that.
从某种意义上讲 这样做会更方便
In general the rule is that if you’ve got more than 50% or 60% missing data,
一般来说 当缺失数据超过50%或60%时
it’s a good idea to delete it, right?
最好把它删掉
Delete either the instances or the attributes
是删除实例还是删除属性
depending on how much data you’ve got missing and where.
取决于丢失的数据量以及其所在的位置
if you’re missing a huge amount of data
如果丢失的数据量太大
then you’re not going to be able to recreate it by let’s say using an average, right?
你就无法用像平均值之类的数字去填充它
We’ve got so little data
因为已知的数据太少
that an average isn’t going to be reliable.
它们的平均值并不可靠
If we have got sufficient data that
反之 如果已知数据够多
we could maybe start to infer what these missing values might be.
也许可以根据它们来推测缺失的数据
We can start to try and replace them
我们可以尝试替换
instead of deleting them.
而非删除缺失值
So what we might do
举个例子
is we might for example set them all to zero.
我们可能可以将它们全部设为零
Maybe if an attribute is missing we can say well okay,
也许如果缺少某个属性 我们可以说好吧
if it’s missing, we’ll just not use it
如果某个值缺失了 那就不用它了
and we’ll say it’s zero.
把它设为0
Now, whether you do that is going to depend on what the attribute is.
而是否将其设为0 取决于属性的情况
Something zero is not a useful property.
有时0对某些属性并不适用
Right and we’ll look at that in the chocolate dataset in a moment.
我们之后将看个具体的例子
What we might also do is
我们也可能
we might start to add the dataset mean into those attributes
将数据集均值添加到这些属性中
So maybe we don’t know what the rating for this chocolate bar is
比如我们不知道某个巧克力棒的评分
but we can guess
但可以推测
that it’s going to be around the average rating for any chocolate bar.
应该和其他巧克力棒的平均情况差不多
Again, this is going to depend on your situation, right?
再强调一次 这将取决于你的实际情况
You’re still making up data in some sense
从某种意义上说 你还是在编造数据
You’ve got to be very careful about what you do here.
因此你必须非常小心
So we’ve deleted as much of our choco data as we feel comfortable doing now.
现在我们成功删除了数据集中该删除的部分
Now let’s see if we can
接下来我们看是否
fill in some of missing values with appropriate replacements.
能用合适的值来替换缺失的数值
So let’s have a look at our attributes.
来看看我们的属性
Alright, so we’ve got company, name, reference, things like this.
我们有公司 品牌名 索引值 诸如此类的
Bean type has been removed,
可可豆种类已经删掉了
but we still got things like the bean origin and the ratings,
但可可豆产地和评分
and there’s a few of these missing from our dataset.
还缺了一些信息
Can we estimate these rather than completely removing them from the dataset?
我们是否能估算并保留它们?
Obviously the less data you use,
显然 你的数据量越少
the less useful things like machine learning are going to be.
像机器学习这类方法的有效性就越有限
So let’s look at an attribute and see what we can do.
我们来看一个属性 并看看我们能做什么
So if we look at bar price,
来看巧克力棒单价
and that’s the price of each chocolate bar
这指的是单个巧克力棒的价格
we can see that there’s a few missing values somewhere around 3%.
可以看到大约缺失了3%的数据
That’s something we want to deal with.
我们需要对此进行处理
But we’ve got enough data, you know 97%
但我们已经有了97%的数据 这足够了
maybe we can start to guess what the prices of these chocolate bars might be.
也许可以试着猜测缺失的巧克力棒价格了
Now this is a good instance
这是一个很好的例子
of a time when you wouldn’t want to just populate with zeros, right?
你不会直接用0填充 对吧?
No chocolate bar is free, I wish.
没有免费的巧克力棒 我想得很美
And so what we need to do is produce a reliable value
因此我们需要计算出一个可靠的值
to represent an unknown price,
来替换这些缺失的价格
rather than just setting them all to be zero.
而非仅仅用0代替
So what we could do here is something like this.
因此我们可以这么操作
We could set every missing bar price to be
我们可以把所有缺失的价格
the average of all the chocolate bar prices.
设置成其他巧克力棒价格的平均值
and that way at least we’re not warping our distribution up or down.
这样起码我们不会扭曲我们的分布
We’re keeping it exactly the same.
这样可以使它跟之前完全一样
We’re gonna say for the chocolate dataset
我们需要找到巧克力数据集中
for any row, where bar price is n/a and for all columns,
巧克力棒价格为NA的单元格
we’re gonna set the bar price to be
把它们的价格设置为
the mean of all the bar prices.
所有巧克力价格的平均值
And we’re gonna obviously remove any NAs from that calculation of what it’s not going to work
显然我们要剔除不可操作的NA值
And that’s already worked.
已经运行好了
So now if we recalculate our missing values,
如果我们重新计算巧克力价格的缺失值
you’ll see that bar price now has zero missing values
可以看到它有0个缺失值
So we’ve fixed that problem. Great.
问题解决了 很棒
So that was quite an easy one, right
这很简单吧?
Bar price seems to me to be quite an intuitive time
看到像巧克力棒价格这种属性
when you would just calculate an average and put it in.
第一反应就是用平均值来填充缺失值
Right now actually, maybe not because
但实际上可能没那么简单 因为
you know, bar price might depend on where in the world we’re selling it
巧克力棒的价格可能还取决于它的销售地
or you know, what company is producing the chocolate bar.
或者具体是哪一家巧克力棒生产公司
So could we do the same thing for rating?
那评分也可以这样吗?
If we look, if we take the sum of all the NA values in rating
来看一下 来对评分属性的NA值进行求和
It’s eight. Right, so there are eight chocolate bars for which there is no rating
有八个 共八个巧克力棒没有评分
So what we can do is we could do something called a stratified replacement
因此我们可以做的是分层替换
We could say well, let’s group our chocolate bars by country or by company
我们把巧克力棒根据国家或公司分成一组
calculate those averages,
计算它们的平均值
and then we can specifically fill in companies missing ratings
然后就可以用对应的公司和销售地价格做填充
based on what that company actually show in the market
来填补缺失的评分
rather than just an average over everything
而非用所有数据的平均值
So what we’re going to do is we’re going to calculate an aggregate function
因此 我们要用aggregate函数
over of the ratings by company
计算各个公司的评分
And we’re going to calculate a median
还有中位数
Median is a little bit more robust to outliers
中位数会抵消异常值的影响
So maybe you make up a very very expensive or very very cheap line.
也许你会有非常昂贵和非常便宜的产品线
The median will get what middle value is, right?
中位数指的是中间的值 对吧?
So this is going to be per company
这会返回每个公司的值
and we can set the columns to be a little bit more helpful using colnames
我们还可以用colnames函数 使结果更清晰
and so now our per company if we look at it,
现在我们可以看到的结果
is each company and the median rating of chocolate bar from
是每个公司 及其对应的评分中位数
I think, one to five.
应该是从1到5
This is how this dataset is going.
数据集就像这样
So now we know that data per company,
现在我们知道了每个公司的数据
we can actually fill those in.
就可以填充它们了
Now you could automate this process.
你也可以自动执行此过程
We don’t have much missing data.
缺失的数据不多
So let’s just show an example of doing it by hand
让我们来手动处理一个例子
So this is the line of code we’re going to do and I’ll talk through it
这是我们要运行的代码 我会边做边讲
So we’re going to say for the chocolate dataset
我们要找到数据集中符合条件的数据
for any value where the chocolate rating is n/a for missing, right?
条件是巧克力评分是NA 意味着缺失
and the company is Vicuna
且公司名为Vicuna
We want to set the rating to be equal to
我们希望将评分设置为
The Vicuna entry in our new per company average or median.
Vicuna对应的平均数或中位数
and that’s going to fill in that value there
会用这个值替换NA
So we do this for all the missing companies
对所有公司都做同样的处理
and what we’re going to find is that we’ve replaced all our missing values with
我们就能成功地用合适的公司评分中位数
appropriate medians for those ratings per company.
替换所有缺失值
So the last thing we might find in our data is outliers.
我们最后要处理的是数据中的异常值
So let’s imagine we do a box plot of cocoa percentage, right?
我们来对可可百分比画一个箱形图吧
So I’m going to produce a box plot of a cocoa percentage
我将根据可可百分比绘制一个箱形图
Now, maybe our assumption is that cocoa percentage in some way
我们假设可可百分比在某种程度上
informs what the rating is going to be,
和评分相关
because maybe a higher cocoa percentage tastes nicer.
可能可可百分比越高 味道就越好
I don’t really know about chocolate.
我对巧克力不太了解
So if we look at this box plot,
来看这个箱形图
what we’ll see is we’ve got actually quite a tight distribution of cocoa percentage right
可以看到 可可百分比的分布情况比较集中
between about 50% and just above 80%
范围在50%到80%多一点
But you can see there are three outliers when it produces a box plot
但在图中可以看到三个异常值
R will show outliers is anything
R语言中对于异常值的定义是
that is more than three standard deviations away from the median
与中位数相差超过三个标准差
What we do with these outliers is going to be a judgment call,
我们需要对这些异常值做出判断
it’s going to depend on a situation
要看具体情况
So, for example, we have an outlier here, which is above a hundred percent,
比如这个异常值超过了100%
now that makes no sense.
这不合逻辑
We can’t have a chocolate bar with more than a hundred percent cocoa,
巧克力棒的可可百分比不会超过100%
right, it doesn’t make sense
对吧 这不合理
So that is obviously a mistake,
因此这显然是错的
we would delete that item right,
我们会把它删掉
and probably delete the whole row
也许需要删掉整行数据
or reestimate that value based on a stratified average or a different average
或者重新用分层平均数或另外的平均数做替换
For these lower ones, this is a judgment call.
我们还要判断这些低百分比
One is just above 20 and one is up closer to 30%
有一个稍微超过20% 还有一个接近30%
I don’t know whether those of outliers or not, right?
我不确定这些是不是异常值
Is it possible to make a viable chocolate bar with 20% cocoa?
巧克力棒可以只含20%的可可吗?
I mean it maybe, right.
有可能吧
You’re going to have to know a little bit something about your the situation that your data was collected in
你需要对于数据收集的背景有一些了解
and whether that’s reasonable.
来判断数据是否合理
So you might for example, delete the bottom one as a mistake,
比如你可能会删掉这个20% 因为它是错的
but keep the top one because that’s just a low amount of cocoa.
但保留30% 因为那只是可可含量比较少而已
So this is what cleaning data is about
这就是数据清洗
We’re going to have missing data, we’re going to have outliers,
我们可能会有数据缺失 异常值
we might have noise.
甚至数据噪声
and you’re going to have to look for your data,
你需要好好研究数据
and try and condense it and remove all these problems
并试着解决这些问题 精简数据
We do this so that we can more effectively transform our data later
我们这么做是为了之后更好地做数据转换
and also reduce our data if we need to.
在必要时还要减小数据集大小
And then eventually your datasets going to be really nice
最后你的数据集质量会很棒
so that we can do things like modeling or machine learning on it.
这样就可以做建模或机器学习之类的了
…per hour. My fuel economy is messaging miles per gallon,
……每小时 我的油耗单位是英里/加仑
but of course, I don’t pump fuel in gallons, I pump it in liters.
但当然 在加油时我不用加仑 我用单位升
And then but when I run anywhere, so short distances
然后当我跑步的时候 描述短距离
I run in kilometers and I run in kilometers per hour.
我用千米 或者千米/小时
So I’m using two different systems there.
所以我用了两种不同的单位系统

发表评论

译制信息
视频概述

我们将正式进入数据预处理的第一步:数据清洗

听录译者

收集自网络

翻译译者

ericaeureka

审核员

审核员CH

视频来源

https://www.youtube.com/watch?v=zVImIQuqjQ0

相关推荐