0

我已经用 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
...

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

4

1 回答 1

0

您可以使用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.
于 2020-04-17T07:41:20.760 回答