Написание программы на python, которая будет загружать котировки акций Yahoo Finance в Excel.

Я создал программу, которая может получать ежемесячную информацию об акциях из Yahoo Finance и распечатывать список этой информации. Я знаю, что моя методология получения информации еще не самая лучшая, но часть, на которой я застрял, — это взять информацию об акциях и записать ее в файл csv. То, что у меня есть до сих пор, правит каждого отдельного персонажа в файл csv.

import requests
from urllib2 import urlopen
import csv
import pandas as pd
from pandas import DataFrame
import datetime
import pandas.io.data

YahooUrl = 'http://ichart.yahoo.com/table.csv?s='
start_month = 1 - 1
start_day = 1
start_year = 2010

end_month = 12 - 1
end_day = 31
end_year = 2014

Start_ApiMonth = '&a=%s' %(start_month)
Start_ApiDay = '&b=%s' %(start_day)
Start_ApiYear = '&c=%s' %(start_year)

End_ApiMonth = '&d=%s' %(end_month)
End_ApiDay = '&e=%s' %(end_day)
End_ApiYear = '&f=%s' %(end_year)

interval = 'm'

ApiInterval = '&g=%s' %(interval)

ApiStatic = '&ignore=.csv'

Ticker = raw_input("What is the ticker > ")

Website = urlopen(YahooUrl + Ticker + Start_ApiMonth + Start_ApiDay +         Start_ApiYear + End_ApiMonth + End_ApiDay + End_ApiYear + ApiInterval +  ApiStatic)
Info = Website.read()

output = open('output.csv','wb')
wr = csv.writer(output, dialect='excel')
for item in Info:
    wr.writerow(item)
print Info

person Evy555    schedule 11.08.2015    source источник
comment
urlopen возвращает объект file;ike. read() возвращает одну строку — вам нужно будет разобрать эту строку, чтобы разделить ее на соответствующие поля. Вы должны включить пример print(Info) - если он не слишком длинный или только его часть (чтобы дать нам представление о структуре) и попытаться разобрать его самостоятельно.   -  person wwii    schedule 11.08.2015
comment
pandas имеет встроенные инструменты для извлечения данных из Yahoo Finance, см. документация для обзора. Использование pandas API требует гораздо меньше ручной работы с вашей стороны.   -  person Marius    schedule 11.08.2015


Ответы (1)


read() возвращает строку, поэтому Info является строкой. Итерация по строке приводит к итерации по каждому из символов, составляющих строку:

>>> for c in 'abcd':
...     print c
a
b
c
d

Поэтому ваш код будет записывать каждый символ в файл csv на отдельной строке.

Данные, которые вы получаете, на самом деле уже в формате CSV. Вот первые несколько строк для акции YHOO:

Date,Open,High,Low,Close,Volume,Adj Close
2014-12-01,51.43,51.68,48.290001,50.509998,16328900,50.509998
2014-11-03,46.049999,52.619999,45.740002,51.740002,25212400,51.740002

Таким образом, это должен быть просто вопрос сохранения файла:

with open('{}.csv'.format(Ticker),'wb') as output:
    output.write(Website.read())

Это запишет данные в файл с именем акции, за которым следует расширение .csv, например. YHOO.csv


Обновить

Следующий код показывает, как загрузить и объединить данные для нескольких акций. Выходной файл теперь нуждается в дополнительном поле для идентификации акции - Stock ID. Это вставляется как первое поле CSV для строк заголовка и сведений. Заголовок выдается только один раз.

import requests

yahoo_url = 'http://ichart.yahoo.com/table.csv'
params = {'a': 0, 'b': 1, 'c': 2010, 'd': 11, 'e': 31, 'f': 2014, 'g': 'm', 'ignore': '.csv'}
stock_ids = ['AAPL', 'GOOG', 'YHOO']
with open('output.csv', 'wb') as output:
    header_written = False
    for stock_id in stock_ids:
        params['s'] = stock_id
        r = requests.get(yahoo_url, params=params)
        lines = r.iter_lines()
        header = next(lines)
        if not header_written:
            output.write('Stock ID,{}\n'.format(header))
            header_written = True
        output.writelines('{},{}\n'.format(stock_id, line) for line in lines)
person mhawke    schedule 11.08.2015
comment
Я ценю помощь. Это сработало отлично! Мне было любопытно, есть ли способ записать информацию о нескольких акциях в Excel. Скажем, я изменил свой код, чтобы получить AAPL и GOOG, и я хотел, чтобы он записывался в один файл CSV. Как бы я это сделал? - person Evy555; 11.08.2015