Получение цены закрытия для нескольких акций с вложенным l oop в Python - PullRequest
0 голосов
/ 09 января 2020

Я пытаюсь получить базу данных с близкими ценами для MSFT и GOOG вместе. Мой код работает, только если я удаляю одну акцию. Может ли кто-нибудь помочь мне?

import pandas as pd
from pandas_datareader import data

start_date = '2014-01-01'
end_date = '2018-01-01'

data1 =('GOOG', 'MSFT')
data2 = data.DataReader(data1, 'yahoo', start_date, end_date)
data3 = data2.tail(200)

close = data3['Close']
for stock in data1:
    for close_price in close : 
         print(close_price)

Ответы [ 4 ]

0 голосов
/ 11 марта 2020

Это будет работать.

import datetime
import pandas as pd
import numpy as np
from pandas_datareader import data as wb

start = '2019-02-01'
end = '2020-02-01'

tickers = ['MMM',
'ABT',
'ABBV',
'ABMD',
'ACN',
'ATVI']

thelen = len(tickers)

price_data = []
for ticker in tickers:
    prices = wb.DataReader(ticker, start = start, end = end, data_source='yahoo')[['Open','Adj Close']]
    price_data.append(prices.assign(ticker=ticker)[['ticker', 'Open', 'Adj Close']])


names = pd.concat(price_data)
names.reset_index()
names

Результат:

           ticker        Open   Adj Close
Date                                     
2019-02-01    MMM  201.490005  190.939163
2019-02-04    MMM  199.009995  191.945831
2019-02-05    MMM  200.720001  192.818268
2019-02-06    MMM  201.220001  194.208420
2019-02-07    MMM  201.020004  191.591080
          ...         ...         ...
2020-01-27   ATVI   58.189999   58.320000
2020-01-28   ATVI   58.790001   60.029999
2020-01-29   ATVI   60.490002   60.400002
2020-01-30   ATVI   59.919998   60.889999
2020-01-31   ATVI   60.200001   58.480000

Теперь, если вы хотите, чтобы результаты были транспонированы, горизонтальные, а не вертикальные, добавьте:

df = pd.concat(price_data)

pd.set_option('display.max_columns', 500)

df = df.reset_index()
df = df.set_index('Date')
table = df.pivot(columns='ticker')
table

Результат:

ticker           ATVI         MMM  
Date                               
2019-02-01  45.643345  190.939163  
2019-02-04  46.407211  191.945831  
2019-02-05  47.458763  192.818268  
2019-02-06  42.657333  194.208420  
2019-02-07  43.609684  191.591080  
              ...         ...  
2020-01-27  58.320000  174.053833  
2020-01-28  60.029999  164.094025  
2020-01-29  60.400002  160.546158  
2020-01-30  60.889999  161.051575  
2020-01-31  58.480000  157.236130  
0 голосов
/ 09 января 2020

Похоже, вы пытаетесь прочитать данные из Yahoo !, но это больше не работает (я не могу загрузить данные с вашим кодом):

https://pandas-datareader.readthedocs.io/en/latest/whatsnew.html#v0 -6 -0 января-24-2018

v0.6.0 (24 января 2018)

Это основной выпуск версии 0.5.0. Мы рекомендуем всем пользователям выполнить обновление.

Предупреждение

Yahoo !, Google Options, Google Quotes и EDGAR были немедленно объявлены устаревшими.

Список текущих поддерживаемых данных источники можно найти здесь:

https://pandas-datareader.readthedocs.io/en/latest/readers/index.html

0 голосов
/ 09 января 2020

Из того, что вы показали нам здесь. мне кажется, что логика c вашего кода не зависит от самих акций, поэтому данные, которые вы получаете в data3, просто не содержат данных для одной из компаний, которую вы хотите отслеживать.

В приведенном ниже коде вы дважды просматриваете одни и те же данные (close) без каких-либо условий, чтобы сопоставить их с акциями, поскольку data3 - это всего лишь .tail() подмножество data2.

data2 = data.DataReader(data1, 'yahoo', start_date, end_date)
data3 = data2.tail(200)
close = data3['Close']
for stock in data1:
    for close_price in close : 
         print(close_price)

вместо этого вы сначала хотели бы создать закрытие для каждой из акций:

close = {}
for stock in data1:
    # a filter method stub that has to be implemented based on your data
    close[stock] = filter_data2_by_stock(stock)

, отфильтровав данные по акциям, вы наверняка получите акцию, которой вы являетесь искать вместо того, что входит в хвост вашего data2 набора данных.

затем вы проследите через эти отфильтрованные данные, чтобы получить значения закрытия для вашей акции как

for stock in data1:
    for close_price in close[stock] : 
         print(close_price)
0 голосов
/ 09 января 2020

@ user12679236, вы можете просто вызвать фрейм данных close, чтобы распечатать его, или, если вы хотите перебрать фрейм данных, вам нужно знать длину и нарезать ее. Здесь для l oop

for i in range(0,close['GOOG'].count()):
    print(close[i:i+1])
...