Если не заморачиваться с графиком (последнее: ...plot()), то у меня получилось с ходу вот это:
То есть, грубо говоря, первый заход получился позитивным, код работает! Но есть кое-какие вопросы. Например, смущает то, что данные полученные таким образом могут в какой-то момент оказаться устаревшими или несоответствующими реальной цене на бирже. Об этом собственно и идет речь в данном запросе.
На этой странице изложена информация по программному интерфейсу к информационно-статистическому серверу (ИСС) Московской биржи. Есть руководство пользователя и примеры на Python и VB.Net. Их конечно я еще не успел рассмотреть. Потому что надо бы вчитаться и в руководство, и в примеры, и вообще немного разобраться с правилами. Но вот на что сразу следует обратить внимание:
Аналогично продукту MOEX Trade INFO, который также работает через ИСС, данные могут предоставляться или по подписке в режиме реального времени или в свободном доступе (без авторизации, но с задержкой).
То есть в свободном доступе данные предоставляются с задержкой. Ну и ладно пока что! Для учебных целей данных с задержкой вполне достаточно. Зато у этого второго метода есть одно важное преимущество, мне кажется. Данные из первоисточника!
P.S. Для понимания. Примеры с Московской биржи на Python2
И что в итоге? После запуска я получил вот такую шикарную таблицу:
Это данные котировок Apple от 2006 года, скачанные с Yahoo!Finance. Маленький тест, который прошел вполне себе удачно.
Кстати, закомментированные строки - это то, что позволяет сохранить полученнный временной ряд с котировками в CVS-файл и потом прочитать его. Также проверил - работает!
Разумеется, для этого мне пришлось выполнить команду: pip install pandas-datareader
В ходе выполнения мне заодно и pandas установился :)
Этот пост - продолжение предыдущего. Как только я понял, как работает gdata, сразу начал писать класс, в котором стал тестировать различные возможности gdata. Нижеприводимый код позволяет получить значение конкретной ячейки на конкретной странице вашей электронной книги. Представляет собой сочетание возможностей двух пакетов: gdata и lxml
#!/usr/bin/pythonimport gdata.spreadsheet.service
from lxml import etree
class YourClass(object):def__init__(self):
email ='your_email'
password ='your_password'# Find this value in the url with 'key=XXX' and copy XXX below
self.key ='your_spreadsheet_key'# All spreadsheets have worksheets. I think worksheet #1 by default always# has a value of 'od6'
self.id='od6'
self.client = gdata.spreadsheet.service.SpreadsheetsService()
self.client.email = email
self.client.password = password
self.client.source ='Example Spreadsheet Writing Application'
self.client.ProgrammaticLogin()def get_value(self, row, col):
rc ='R'+str(row)+'C'+str(col)
feed = self.client.GetCellsFeed(self.key, self.id, rc)
xml = feed.ToString()# http://gdata-python-client.googlecode.com/hg/pydocs/gdata.spreadsheet.html
tree = etree.fromstring(xml)
ns ={'ns1':'http://schemas.google.com/spreadsheets/2006'}
cells = tree.xpath('//ns1:cell', namespaces=ns)
cell = cells[0]return cell.text
Статья не очень свежая, тем не менее, мне удалось установить на своем компе пакет gdata, и попробовать реализовать следующий простой алгоритм:
#!/usr/bin/pythonimport time
import gdata.spreadsheet.service
email ='youraccount@gmail.com'
password ='yourpassword'
weight ='180'# Find this value in the url with 'key=XXX' and copy XXX below
spreadsheet_key ='pRoiw3us3wh1FyEip46wYtW'# All spreadsheets have worksheets. I think worksheet #1 by default always# has a value of 'od6'
worksheet_id ='od6'
spr_client = gdata.spreadsheet.service.SpreadsheetsService()
spr_client.email = email
spr_client.password = password
spr_client.source ='Example Spreadsheet Writing Application'
spr_client.ProgrammaticLogin()# Prepare the dictionary to writedict={}dict['date']= time.strftime('%m/%d/%Y')dict['time']= time.strftime('%H:%M:%S')dict['weight']= weight
printdict
entry = spr_client.InsertRow(dict, spreadsheet_key, worksheet_id)ifisinstance(entry, gdata.spreadsheet.SpreadsheetsList):print"Insert row succeeded."else:print"Insert row failed."
Могу сказать - на чем я срезался. На этой команде:
Он мне выдал какую-то ошибку, которую я не смог проанализировать (дело было в четвертом часу ночи, сами понимаете!) Что-то вроде статус 400, bad request. Эта ошибка обсуждается, кажется, здесь и здесь. Кроме того, в вышеупомянутой статье есть какое-то обсуждения в комментах.
P.S. А ларчик просто открывался. Читайте, товарищи, как говорится, документацию - там все написано. Помогло даже не столько чтение issue 363 и 481, сколько самого исходного кода. Просто я не обратил поздно ночью внимания на то, что данные вставляются в "плоскую таблицу", то есть в электронную таблицу в левом верхнем углу с data, weight и time. То есть так, как показано на картинке в вышеозначенном примере. Теперь все заработало :)
В небольших проектах SQLITE3, основанных на Python (в частности, Django) - как раз та база, что надо. Просто. Удобно. Эффективно. Меня вообще привлекает в программировании то, что просто. А тут - представьте себе - вся база данных умещается в один простой файл, который хранится на жестком диске.
И так, и так получается неплохо. Но мне больше в душу запал второй вариант.
Как запустить оболочку? Если вы работаете на Linux (у меня на компе - старая добрая Ubuntu), откройте терминал, зайдете в каталог, где у вас база данных (пусть она называется, скажем, test.db) и введите команду:
sqlite> .schema University CREATE TABLE University ( UniversityID INTEGER PRIMARY KEY, UniversityCode TEXT NOT NULL, UniversityName TEXT NOT NULL, Country TEXT); sqlite>
Легко и просто можно посмотреть схему конкретной таблицы. Другая команда:
sqlite> .tab
С ее помощью вы получите список таблиц, которые есть в базе test.db. Далее, допустим, что в базе test.db есть таблица persons. Содержимое этой таблицы вы получаете легко и просто с помощью команды:
sqlite> select * from persons;
(Совет: не забудьте про точку с запятой в конце команды, иначе не сработает!)
Если сравнивать с библиотекой sqlite3, то вроде и там все то же самое можно сделать. Но мне - далеко не специалисту в SQL - как-то затруднительно понять, как получить с помощью этой библиотеку список таблиц базы данных или схему конкретной таблицы. Я невнимательно читал документацию? Очень может быть. Но ведь я - ленивый юзер. А ленивый юзер при прочих равных условиях - конечно, выберет sqlite3 sherll. IMHO
Пришел к твердому выводу, что для легкого и изящного Python технология XML несколько тяжеловата. То есть в ряде случаев она может быть весьма полезной и эффективной, но увы, далеко не всегда. Это особенно четко осознаешь, когда пробуешь руками альтернативу. См. статью:
Что же касается целевого назначения YAML, то он годится не только для конфигов, но как мне представляется и для хранения структурированных текстовых данных. Получается отличная вещь! Легкое решение - не то что XML. Есть иерархическая структура данных - не то что CSV. И парсить файлы действительно легко. В результате мне удается организовать хранение требуемых данных вне базы данных типа SQLite3 или MySQL.
Зачем это надо? Есть одно соображение. Если данных пока не очень много, структура данных определена не четко и может быть подвержена частым изменениям, и вообще вы пока не знаете, в каком направлении будет развиваться ваш проект. Тогда гибкий подход к управлению данными - то что надо. По производительности это не то что СУБД, зато гибкость все окупает.
Comments
🚂 Во-первых, ловите ваш билет на поезд в страну Новогодию. Переходите по ссылке, там новогодняя анкета, заполняйте её…