这是设置:
arrays = [["2010-01-01","2010-01-01","2010-01-02","2010-01-02","2010-01-03","2010-01-03"],
["MSFT", "AAPL", "MSFT", "AAPL","MSFT", "AAPL"]]
tuples = list(zip(*arrays))
index = pd.MultiIndex.from_tuples(tuples, names=["date", "symbol"])
df = pd.DataFrame(data=np.random.randn(6, 4), index=index, columns=["high", "low", "open", "close"])
def fn_sum(close, high, low):
return close+high+low
def fn_plus(close):
return close+1
DF 看起来像这样:
date symbol high low open close
2010-01-01 MSFT 1.144042 0.889603 -0.193715 1.005927
AAPL 0.433530 -0.291510 1.420505 0.326206
2010-01-02 MSFT -1.509419 -0.273476 -0.620735 -0.205946
AAPL 0.454401 -0.085008 0.686485 1.309894
2010-01-03 MSFT 1.487588 -0.777500 -0.218993 -1.242664
AAPL -0.456024 -0.819463 -2.224953 1.263124
我想对所有具有 groupby()、apply() 方式的符号使用技术分析函数,如下所示:
df["1"] = df.groupby(level="symbol").apply(lambda x: fn_sum(x["close"], x["high"], x["low"]))
这会导致广播错误:
ValueError: operands could not be broadcast together with shapes (6,2) (3,) (6,2)
但是,在单个列上执行相同的操作可以:
df["2"] = df.groupby(level="symbol").close.apply(lambda x: fn_plus(x))
问题:
那么,当在多个列上使用 apply 并将它们组合回 DataFrame 而不会出现广播问题时,我该如何让它工作呢?
另外,我非常感谢与上面的 MultiIndex DF 一起使用的更好的实现。
有关更多上下文:我想使用 TA-lib 包中的技术分析功能。见:https ://mrjbq7.github.io/ta-lib/func_groups/volatility_indicators.html
函数如下所示(例如):
ATR(高,低,收盘[,时间段=?])
平均真实范围(波动率指标)
输入:价格:['high','low','close'] 参数:时间段:14 输出:real
在人为的示例中,我得到了与上面相同的广播错误。