【问题标题】:How can I slice a multiIndex dataframe with stocks data?如何使用股票数据对 multiIndex 数据框进行切片?
【发布时间】:2020-04-17 07:27:41
【问题描述】:

我已经用 yfinance 下载了股票数据,我正在尝试为每只股票将 DataFrame 分割成一个 df,但我真的不知道该怎么做。数据是一个带有 multiIndex 的 df,但列是用信息和代码的元组设置的(下面的示例),但不是我想要的代码本身用于我的数据分析。即使我调用“df.info”函数,它也只会带来信息列而不是股票行情。如何切片此 df 以使信息由代码分隔?正确知道的代码如下:

import pandas as pd
import yfinance as yf
import pandas_datareader.data as pdr
yf.pdr_override()
tickers = ['PETR4.SA', 'PFRM3.SA', 'BIOM3.SA', 'DASA3.SA']
acoes = pdr.get_data_yahoo(tickers)
print(acoes)
print(type(acoes))

acoes的细化结果是:

DatetimeIndex: 5056 entries, 2000-01-03 to 2020-04-16
Data columns (total 24 columns):
 #   Column                 Non-Null Count  Dtype  
---  ------                 --------------  -----
0   (Adj Close, BIOM3.SA)  4448 non-null   float64
1   (Adj Close, DASA3.SA)  3794 non-null   float64
2   (Adj Close, PETR4.SA)  4990 non-null   float64
3   (Adj Close, PFRM3.SA)  3316 non-null   float64
4   (Close, BIOM3.SA)      4448 non-null   float64
...

我的主要目标是开发用于搜索单个或多个股票信息的代码以运行一些分析。我没有任何编码或编程经验,我这样做只是为了让我在金融市场上的生活更轻松,哈哈。提前致谢!

【问题讨论】:

    标签: python pandas dataframe yahoo-finance stock-data


    【解决方案1】:

    您可以使用melt 将列转换为行。

    acoes.index.name = 'date'
    long_form = acoes.reset_index().melt('date', var_name=['var', 'ticker'])
    long_form
    #              date        var    ticker     value
    # 0      2000-01-03  Adj Close  BIOM3.SA       NaN
    # 1      2000-01-04  Adj Close  BIOM3.SA       NaN
    # 2      2000-01-05  Adj Close  BIOM3.SA       NaN
    # 3      2000-01-06  Adj Close  BIOM3.SA       NaN
    # 4      2000-01-07  Adj Close  BIOM3.SA       NaN
    # ...           ...        ...       ...       ...
    

    原始数据有两列级别作为列名,因此它们最终以长形式出现在两个不同的列中。然后,您可以使用 pivot_table 将每个变量扩大到一列,同时将 ticker 保留为一列。

    long_form.pivot_table(index=['date', 'ticker'], columns='var', values='value').reset_index()
    # var         date    ticker  Adj Close   Close    High     Low    Open        Volume
    # 0     2000-01-03  PETR4.SA   4.050402   5.875   5.875   5.875   5.875  3.538944e+10
    # 1     2000-01-04  PETR4.SA   3.826338   5.550   5.550   5.550   5.550  2.886144e+10
    # 2     2000-01-05  PETR4.SA   3.787730   5.494   5.494   5.494   5.494  4.303360e+10
    # 3     2000-01-06  PETR4.SA   3.774631   5.475   5.475   5.475   5.475  3.405568e+10
    # 4     2000-01-07  PETR4.SA   3.791866   5.500   5.500   5.500   5.500  2.091264e+10
    # ...          ...       ...        ...     ...     ...     ...     ...           ...
    

    最后,您可以使用 groupby 和迭代按股票代码拆分。

    for ticker, sub_df in long_form.groupby('ticker'):
        # sub_df has the data for a single ticker.
        # Do what you want with it.
    

    【讨论】:

      猜你喜欢
      • 2018-10-21
      • 2018-01-01
      • 2017-06-03
      • 2012-11-26
      • 1970-01-01
      • 2021-05-04
      • 2015-05-11
      • 1970-01-01
      • 2022-11-14
      相关资源
      最近更新 更多