Как я могу нарезать мульти-индексный фрейм данных с данными об акциях? - PullRequest
0 голосов
/ 17 апреля 2020

Я скачал данные акций с помощью yfinance, и я пытаюсь нарезать DataFrame по одному df для каждой акции, но я действительно не знаю, как это сделать. Данные представляют собой df с multiIndex, но столбцы были заданы с помощью кортежей информации и тикеров (пример ниже), но не с самими тикерами, как я хочу для анализа данных. Даже если я вызываю функцию "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
...

Моя главная цель - разработать код для поиск одиночной или многоуровневой информации для проведения анализа. У меня нет никакого опыта в программировании и программировании, и я делаю это только для того, чтобы облегчить свою жизнь на финансовом рынке, ха-ха. Заранее спасибо!

1 Ответ

0 голосов
/ 17 апреля 2020

Вы можете объединить столбцы в строки с помощью 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...