如何使用股票数据分割多索引数据帧?

2024-05-23 15:54:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经用yfinance下载了股票数据,我正试图将数据帧分割成每个股票的一个df,但我真的不知道怎么做。数据是一个带有多索引的df,但列是用infos和tickers的元组设置的(下面的示例),而不是我希望用于数据分析的tickers本身。即使我调用“df.info”函数,它也只带来infos列,而不是ticker。我如何分割此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))

acos的详细说明结果如下:

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
...

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


Tags: 数据importdfcloseassanull股票
1条回答
网友
1楼 · 发布于 2024-05-23 15:54:53

可以使用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和迭代按ticker进行拆分

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

相关问题 更多 >