簡體   English   中英

將兩列相乘 pandas MultiIndex dataframe

[英]Multiply two columns in a pandas MultiIndex dataframe

我從未使用過 multiIndex pandas 數據幀,而 Python API 用於我使用的財務程序 CalcBench,當我鍵入以下代碼時返回一個:

dataItems = ["ROE", "StockholdersEquity", "SharesOutstandingEndOfPeriod", "EndOfPeriodStockPrice"]             
data = cb.normalized_data(tickers, dataItems, start_year=2021, end_year=2021, period_type='annual')

如果我嘗試通過鍵入data.info()來探索我的 dataframe,我得到:

<class 'pandas.core.frame.DataFrame'>
PeriodIndex: 1 entries, 2021 to 2021
Freq: A-DEC
Columns: 1800 entries, ('EndOfPeriodStockPrice', 'A') to ('StockholdersEquity', 'ZTS')
dtypes: float64(1800)

輸入data.columns()給我:

MultiIndex([('EndOfPeriodStockPrice',    'A'),
            ('EndOfPeriodStockPrice',  'AAL'),
            ('EndOfPeriodStockPrice',  'AAP'),
            ('EndOfPeriodStockPrice', 'AAPL'),
            ('EndOfPeriodStockPrice', 'ABBV'),
            ('EndOfPeriodStockPrice',  'ABC'),
            ('EndOfPeriodStockPrice',  'ABT'),
            ('EndOfPeriodStockPrice',  'ACN'),
            ('EndOfPeriodStockPrice', 'ADBE'),
            ('EndOfPeriodStockPrice',  'ADI'),
            ...
            (   'StockholdersEquity', 'WYNN'),
            (   'StockholdersEquity',  'XEL'),
            (   'StockholdersEquity',  'XOM'),
            (   'StockholdersEquity', 'XRAY'),
            (   'StockholdersEquity',  'XYL'),
            (   'StockholdersEquity',  'YUM'),
            (   'StockholdersEquity',  'ZBH'),
            (   'StockholdersEquity', 'ZBRA'),
            (   'StockholdersEquity', 'ZION'),
            (   'StockholdersEquity',  'ZTS')],
           names=['metric', 'ticker'], length=1800)

我想通過將EndofPeriodStockPriceSharesOutstandingEndOfPeriod的相應條目相乘,在 dataframe 中為 2021 年的每家公司創建一個新指標MarketCapAtEndOfPeriod

我為此所做的努力沒有任何結果,搜索 StackOverflow 也沒有幫助我解決我的問題。 松散地說,我想寫這樣的東西:

data["MarketCapAtEndOfPeriod"] = data["EndofPeriodStockPrice"] * data["SharesOutstandingEndOfPeriod"]
market_cap = data.EndOfPeriodStockPrice * data.SharesOutstandingEndOfPeriod
market_cap_df = pd.concat(
    {"MarketCap": market_cap},
    names=["metric"],
    axis=1,
)

data = data.join(market_cap_df)

EndofPeriodStockPriceSharesOutstandingEndOfPeriod的相應條目相乘

使用DataFrame.xs通過指定 label 和可選的軸/水平來訪問 MultiIndex 橫截面。

  • 在您的情況下,目標標簽位於第一級(默認),因此您可以省略level=0並為列指定axis=1
  • 要將 output 分配為新列,請在重新加入原始MultiIndex.from_product之前使用 MultiIndex.from_product 重建 MultiIndex。
key1 = 'EndofPeriodStockPrice'
key2 = 'SharesOutstandingEndOfPeriod'
new = 'MarketCapAtEndOfPeriod'

prod = data.xs(key1, axis=1) * data.xs(key2, axis=1)

prod.columns = pd.MultiIndex.from_product([[new], [key1, key2]])
# MultiIndex([('MarketCapAtEndOfPeriod', 'EndofPeriodStockPrice'),
#             ('MarketCapAtEndOfPeriod', 'SharesOutstandingEndOfPeriod')])

df = df.join(prod)

如果假設您想划分相應的AAPLABC條目,則它們位於第二列級別,因此同時指定axis=1level=1

data.xs('AAPL', axis=1, level=1) / data.xs('ABC', axis=1, level=1)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM