Я пытаюсь перебрать фрейм данных, получить данные и добавить строку за строкой. Попытка получить данные о запасах (одна строка) для каждой компании
Код ниже:
df = pdr.get_data_yahoo('ABB.NS', start = "2021-6-2", end = "2021-6-3")
df
Результат:
Open High Low Close Adj Close Volume
Date
2021-06-02 1698.0 1717.0 1668.0 1700.55 1700.55 314707
Точно так же у меня есть список названий компаний, и я хочу получить одну строку компании и добавить их строку за строкой.
Список
sym = symbol[:5]
sym
Выход:
['20MICRONS.NS', '21STCENMGM.NS', '3IINFOTECH.NS', '3MINDIA.NS', '3PLAND.NS']
Код, с которым я пытаюсь,
for i in sym:
df = pdr.get_data_yahoo(i, start = "2021-6-2", end = "2021-6-3")
Выход:
Open High Low Close Adj Close Volume
Date
2021-06-02 14.05 14.05 13.25 13.5 13.5 3861
Ожидаемый результат:
Open High Low Close Adj Close Volume
Date
2021-06-02 14.05 14.05 13.25 13.5 13.5 3861
" Other Other Other Other Other Other
" Other Other Other Other Other Other
" Other Other Other Other Other Other
" Other Other Other Other Other Other
Other are the stock values according to the companies
вывод - только одна строка. Я пытаюсь получить 5 строк, потому что повторяю названия 5 компаний.
Если у компании нет данных на конкретную дату, она возвращает ошибку, например
Exception in thread Thread-96:
Traceback (most recent call last):
File "c:\python37\lib\threading.py", line 926, in _bootstrap_inner
self.run()
File "c:\python37\lib\threading.py", line 870, in run
self._target(*self._args, **self._kwargs)
File "C:\Users\venka\all\lib\site-packages\multitasking\__init__.py", line 102, in _run_via_pool
return callee(*args, **kwargs)
File "C:\Users\venka\all\lib\site-packages\fix_yahoo_finance\__init__.py", line 322, in _download_one_threaded
period, interval, prepost)
File "C:\Users\venka\all\lib\site-packages\fix_yahoo_finance\__init__.py", line 333, in _download_one
actions=actions, auto_adjust=auto_adjust)
File "C:\Users\venka\all\lib\site-packages\fix_yahoo_finance\__init__.py", line 246, in history
raise ValueError(self.ticker, err_msg)
ValueError: ('ANMOL.NS', 'No data found, symbol may be delisted')
ANMOL.NS Данные компании Symbol отсутствуют на определенную дату. Как дать в этом месте нулевые значения?
get_data_yahoo
может взять список в качестве входных данных, тогда stack
преобразовать в длинный формат:
sym = ['20MICRONS.NS', '21STCENMGM.NS', '3IINFOTECH.NS', '3MINDIA.NS',
'3PLAND.NS']
df = pdr.get_data_yahoo(sym, start="2021-6-2", end="2021-6-3").stack()
df
:
Attributes Adj Close Close High Low Open Volume
Date Symbols
2021-06-02 20MICRONS.NS 60.700001 60.700001 61.900002 59.500000 59.950001 374552
21STCENMGM.NS 15.650000 15.650000 15.650000 15.250000 15.250000 1810
3IINFOTECH.NS 9.200000 9.200000 9.300000 8.650000 8.850000 39107857
3MINDIA.NS 25967.199219 25967.199219 26000.000000 25543.750000 25640.000000 3698
3PLAND.NS 13.500000 13.500000 14.050000 13.250000 14.050000 3861
2021-06-03 20MICRONS.NS 62.549999 62.549999 64.349998 61.099998 62.250000 401022
21STCENMGM.NS 15.950000 15.950000 15.950000 15.950000 15.950000 949
3IINFOTECH.NS 8.950000 8.950000 9.250000 8.900000 9.200000 17823524
3MINDIA.NS 26261.800781 26261.800781 26300.000000 25900.000000 25967.199219 2713
3PLAND.NS 13.950000 13.950000 14.100000 13.400000 14.000000 19728
(По желанию reset_index
чтобы превратить MultiIndex в столбцы)
df = (
pdr.get_data_yahoo(sym, start="2021-6-2", end="2021-6-3")
.stack()
.reset_index()
)
df
:
Attributes Date Symbols Adj Close Close High Low Open Volume
0 2021-06-02 20MICRONS.NS 60.700001 60.700001 61.900002 59.500000 59.950001 374552
1 2021-06-02 21STCENMGM.NS 15.650000 15.650000 15.650000 15.250000 15.250000 1810
2 2021-06-02 3IINFOTECH.NS 9.200000 9.200000 9.300000 8.650000 8.850000 39107857
3 2021-06-02 3MINDIA.NS 25967.199219 25967.199219 26000.000000 25543.750000 25640.000000 3698
4 2021-06-02 3PLAND.NS 13.500000 13.500000 14.050000 13.250000 14.050000 3861
5 2021-06-03 20MICRONS.NS 62.549999 62.549999 64.349998 61.099998 62.250000 401022
6 2021-06-03 21STCENMGM.NS 15.950000 15.950000 15.950000 15.950000 15.950000 949
7 2021-06-03 3IINFOTECH.NS 8.950000 8.950000 9.250000 8.900000 9.200000 17823524
8 2021-06-03 3MINDIA.NS 26261.800781 26261.800781 26300.000000 25900.000000 25967.199219 2713
9 2021-06-03 3PLAND.NS 13.950000 13.950000 14.100000 13.400000 14.000000 19728
Явная обработка ошибок при последовательном чтении:
import pandas as pd
import pandas_datareader as pdr
from pandas_datareader._utils import RemoteDataError
sym = ['20MICRONS.NS', '21STCENMGM.NS', '3IINFOTECH.NS', '3MINDIA.NS',
'3PLAND.NS', 'ANMOL.NS']
dfs = []
for s in sym:
try:
dfs.append(pdr.get_data_yahoo(s, start="2021-6-2", end="2021-6-3"))
except RemoteDataError:
print(f'{s} could not be resolved')
df = pd.concat(dfs)
print(df)
Выход:
ANMOL.NS could not be resolved
High Low ... Volume Adj Close
Date ...
2021-06-02 61.900002 59.500000 ... 374552 60.700001
2021-06-03 64.349998 61.099998 ... 401022 62.549999
2021-06-02 15.650000 15.250000 ... 1810 15.650000
2021-06-03 15.950000 15.950000 ... 949 15.950000
2021-06-02 9.300000 8.650000 ... 39107857 9.200000
2021-06-03 9.250000 8.900000 ... 17823524 8.950000
2021-06-02 26000.000000 25543.750000 ... 3698 25967.199219
2021-06-03 26300.000000 25900.000000 ... 2713 26261.800781
2021-06-02 14.050000 13.250000 ... 3861 13.500000
2021-06-03 14.100000 13.400000 ... 19728 13.950000
на каждой итерации цикла for вы перезаписываете предыдущее значение df. Один из способов решения:
df_list = []
for i in sym:
df_list.append(pdr.get_data_yahoo(i, start = "2021-6-2", end = "2021-6-3"))
df = pd.concat(df_list, axis=0)
РЕДАКТИРОВАТЬ: Я вижу, что у вас есть «дата» в качестве индекса df. Вам нужно будет поиграть с этим, чтобы ваш окончательный df имел смысл.
stack
по умолчанию его сбросит. Если вы хотите сохранить добавленныеNaN
установите dropna в false в.stack(dropna=False)
. Henry Ecker