我有一个数据框 df
,只有一列 extension
。
extension
列中的值循环增加和减少,如下所示:
extension
0.000
0.050
0.100
0.150
0.130
0.080
0.020
0.050
0.075
我正在尝试标记每个增加和减少的循环,如下所示:
extension lablel
0.000 1
0.050 1
0.100 1
0.150 1
0.130 1
0.080 1
0.020 1
0.050 2
0.075 2
我有点卡住了,希望得到一些指导。
答案 0 :(得分:1)
getSecret().then(secret => {
const strategy = new OAuth2Strategy({
secret: secret
}, function (accessToken, refreshToken, params, profile, done) {
done(null,{data: 'some user data'});
})
passport.use('oauth2', strategy);
refresh.use('oauth2', strategy);
app.get('/my_route', async function (req, res) {
...
})
})
答案 1 :(得分:1)
那么让我们重现您的数据:
a = [0.000,0.050,0.100,0.150,0.130,0.080,0.020,0.050,0.075]
df = pd.DataFrame(a, columns=["extension"])
简短的回答是:
df["label"] = pd.Series(np.where(df["extension"].diff() < 0, 0, 1)).diff().abs().cumsum() + 1
df.at[0,"label"] = 1
至少这是我的答案。但它绝对看起来有点笨重。所以让我们分解一步一步地理解:
df["extension"].diff()
diff
创建每个单元格与前一个单元格之间的差异。因此它无法为第一个元素计算它。
输出:
0 NaN
1 0.050
2 0.050
3 0.050
4 -0.020
5 -0.050
6 -0.060
7 0.030
8 0.025
现在让我们二值化结果以检测正/负差异的变化,使用来自 numpy 的 where
:
np.where(df["extension"].diff() < 0, 0, 1)
输出:
array([1, 1, 1, 1, 0, 0, 0, 1, 1])
这告诉我们与之前的差异是负数 (--> 0) 还是正数 (--> 1)
那么您只想知道正/负趋势何时发生变化。因此,我们再次合并了 diff
函数。事先我们必须将 numpy 数组转换回 pd.Series
:
pd.Series(np.where(df["extension"].diff() < 0, 0, 1)).diff()
输出:
0 NaN
1 0.0
2 0.0
3 0.0
4 -1.0
5 0.0
6 0.0
7 1.0
8 0.0
最终,您对趋势改变的方向不感兴趣,只对它改变感兴趣,因此我们使用 abs
函数删除此信息。然后将结果与 cumsum
函数相加,以便它可以在每次更改时增加:
pd.Series(np.where(df["extension"].diff() < 0, 0, 1)).diff().abs().cumsum()
输出:
0 NaN
1 0.0
2 0.0
3 0.0
4 1.0
5 1.0
6 1.0
7 2.0
8 2.0
最后添加两个以 1 而不是 0 为基础的标签,并替换为 NaN 的第一个项目:
代码后面的 +1 和 df.at[0,"label"] = 1
就这样:
extension label
0 0.000 1.0
1 0.050 1.0
2 0.100 1.0
3 0.150 1.0
4 0.130 2.0
5 0.080 2.0
6 0.020 2.0
7 0.050 3.0
8 0.075 3.0
编辑:在评论中回答已编辑的问题