我最近问了一个问题,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"})
目标是如果当前行的最高价大于前一行的“Adj Close”,则获得 True。
这就是我得到的:
调整关闭 | 检查 | |||||
---|---|---|---|---|---|---|
ITUB4.SA | PETR4.SA | VALE3.SA | ITUB4.SA | PETR4.SA | VALE3.SA | |
日期 | ||||||
11-09-2023 | 错误 | 错误 | 错误 | 错误 | 错误 | 错误 |
有2个问题:
为什么我会看到 Adj Close 列以及 Check 列?
所有值均为 False。在实际的 df 中,很多最高值都大于平移收盘值。
我不明白为什么
df.eq(df.shifted)
工作正常,但 df.gt(otherdf.shifted)
不行。
有人能解释一下吗?
谢谢!
为什么我会看到 Adj Close 列以及 Check 列?
因为第一级列有不同的名称(“High”与“Adj Close”:
>>> 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