我目前正在尝试使用以下代码将我的嵌套框架中的列fractShrs
的值从初始值1设置为(numShrs (t) / numShrs(t+1)
def populate_fraction_of_shares(df: pd.DataFrame) -> pd.DataFrame:
# Create a mask with all numShrs that are different set to True
mask = df['numShrs'] != df['numShrs'].shift()
# Apply the mask to only divide by the different ones
df['fractShrs'] = df['numShrs'].div(df['numShrs'].shift().where(cond=mask, other=1))
# Normalize values dividing by the numShrs of the last row, so we start by 1
df['fractShrs'] = df['fractShrs'].div(df.iloc[-1]['numShrs'])
我的数据框看起来像这样
VWAP VWAPAdj country dividend dividendAdj freeFloatPct numShrs pxAsk pxAskAdj pxBid pxBidAdj pxHigh pxHighAdj pxLast pxLastAdj pxLow pxLowAdj returnIndex turnover volume isin name currency fractShrs
date
2023-07-03 176.503682 176.503682 USA 1.00 1.00 94.0 150.00 176.352591 176.352591 176.343429 176.343429 177.644518 177.644518 176.343429 176.343429 175.702037 175.702037 193326.88 5.547447e+09 31458200.0 US0378331005 APPLE INC COM EUR 1
2023-07-05 176.535496 176.535496 USA 1.00 1.00 94.0 150.00 176.292623 176.292623 176.283409 176.283409 177.812933 177.812933 176.292623 176.292623 175.638415 175.638415 192191.75 8.271696e+09 46920262.0 US0378331005 APPLE INC COM EUR 1
2023-07-06 175.203695 175.203695 USA 1.00 1.00 94.0 600.00 176.125087 176.125087 176.106719 176.106719 176.345505 176.345505 176.152638 176.152638 173.755691 173.755691 192673.94 7.954350e+09 45156008.0 US0378331005 APPLE INC COM EUR 1
应该发生的是,假设从1到4的份额数量(如2023-07-06发生的情况,从150到600),那么fractShrs
应该从1到0.25,这是从底部传播到顶部,保持在0.25,直到numShrs再次改变并执行另一次计算。
我的代码应用了一个掩码,将numShrs
更改为True的行设置为False,这对每一行都很有效,除了那些设置为True的行,其中1/numShrs
正在发生,并且我得到了像6.35780394e-8这样的巨大值,但我想在这种情况下使用与numShrs
相同的值。
我试过这么做
...
df['fractShrs'] = df['numShrs'].div(df['numShrs'].shift().where(cond=mask, other=df['numShrs']))
...
但它不起作用,我只是想在where条件不匹配时使用numShrs
的当前值。
非常感谢,提前为这篇长文章道歉。
1条答案
按热度按时间uajslkp61#
使用
df['fractShrs'] = df['numShrs'].div(df['numShrs'].shift().where(cond=mask, other=df['numShrs'])
)尝试的方法几乎是正确的,但是where方法返回的值是df['numShrs'].shift()
(条件是True
)和df['numShrs']
(条件是False
),因此当条件是True
时,它仍然会除以df['numShrs'].shift()
。为了实现所需的行为,您可以考虑使用NumPy中的np.where函数来应用所需的逻辑,如下所示:
希望这能帮到你!