将“gt”与两个 multindex datframe 一起使用

Using 'gt' with two multindex datframes

提问人:AndysPythonStuff 提问时间:10/30/2023 更新时间:10/30/2023 访问量:28

问:

我最近问了一个问题,Timeless 回答了一段引人入胜的代码,它做了它应该做的事情。

基本上,我使用雅虎财经的多索引时间序列 df,使用级别 0 索引作为“Adj Close”和“High”。1 级索引是公司代码的列表。

我试图改编原始代码,但我陷入了真正的混乱。这是我的改编:

def indicators_df(df):
    def xs(df, m):
        return df.xs(m, axis=1, drop_level=False)

    def rn(df, d):
        return df.rename(d, axis=1, level=0)

    tmp1 = df.pipe(xs, "Adj Close")    
    tmp2 = df.pipe(xs, "High")
    
    chk = tmp2.gt(tmp.shift()).pipe(rn, {"High": "Check"})

    return chk

原始代码为:

chk = tmp2.eq(tmp2.shift()).pipe(rn, {"High": "Check"})

如果当前行的“High”与上一行的“High”相同,则返回 True

我的改编进行了以下更改:

1) I add in:

    tmp1 = df.pipe(xs, "Adj Close")

2) I change chk to:

    chk = tmp2.gt(tmp1.shift()).pipe(rn, {"High": "Check"})

目标是如果当前行的 High 大于前一行的 'Adj Close',则获得 True。

这是我得到的:

调整关闭 检查
ITUB4.SA PETR4.SA VALE3.SA ITUB4.SA PETR4.SA VALE3.SA
日期
11-09-2023

有 2 个问题:

  1. 为什么我会同时获得 Adj Close 列和 Check 列?

  2. 所有值均为 False。在实际 df 中,许多高值大于移位收盘价值。

我不明白为什么工作正常但不能.df.eq(df.shifted)df.gt(otherdf.shifted)

有人对此有所了解吗?

谢谢!

Pandas DataFrame 比较多索引

评论


答:

2赞 Corralien 10/30/2023 #1

为什么我会同时获得 Adj Close 列和 Check 列?

因为第一级列具有不同的名称(“High”与“Adj Close”),并且 Pandas 无法对齐其索引:

>>> tmp2.gt(tmp1.pipe(rn, {"Adj Close": "High"})).pipe(rn, {"High": "Check"})

           Check            
              C1    C2    C3
Date                        
02-01-2020  True  True  True
03-01-2020  True  True  True

评论

0赞 AndysPythonStuff 10/30/2023
啊......意义!谢谢!我认为我误解了重命名发生的方式/时间。