Перенос портфолио Google Finance в R

Я хочу получить доступ к данным из моего финансового портфеля Google в R. Я пытаюсь сделать это, прочитав Google Finance API и по примеру RGoogleDocs. Я добился определенного прогресса, но у меня большие проблемы с разбором XML-версии финансового портфеля Google.

require(RGoogleDocs)

#Autheticate using RGoogleDocs
auth = getGoogleAuth("[email protected]", "password",service="finance")
con = getGoogleDocsConnection(auth)

#Get positions
positions <- getURL("http://finance.google.com/finance/feeds/default/portfolios/6/positions",curl=con)
positions <- xmlInternalTreeParse(positions)
positions['entry'] #Returns nothing, should return a list of stocks
xpathApply(positions, "//a") #Also returns nothing

Вот пример. Я пытаюсь разобрать все элементы «входа» из этого документа.

require(XML)
positions <-  "<?xml version='1.0' encoding='UTF-8'?><entry xmlns='http://www.w3.org/2005/Atom' xmlns:gf='http://schemas.google.com/finance/2007' xmlns:gd='http://schemas.google.com/g/2005'><id>http://finance.google.com/finance/feeds/[email protected]/portfolios/7/positions/NYSE:SPY</id><updated>2011-07-18T21:42:07.000Z</updated><category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/finance/2007#position'/><title type='text'>SPDR S&amp;P 500 ETF</title><link rel='self' type='application/atom+xml' href='http://finance.google.com/finance/feeds/default/portfolios/7/positions/NYSE%3ASPY'/><gd:feedLink href='http://finance.google.com/finance/feeds/[email protected]/portfolios/7/positions/NYSE:SPY/transactions'/><gf:positionData gainPercentage='0.0' return1w='0.0' return1y='0.0' return3m='0.0' return3y='0.0' return4w='0.0' return5y='0.0' returnOverall='0.0' returnYTD='0.0' shares='0.0'/><gf:symbol exchange='NYSE' fullName='SPDR S&amp;P 500 ETF' symbol='SPY'/></entry>"
positions <- xmlInternalTreeParse(positions)
positions['entry']

РЕДАКТИРОВАТЬ:

По какой-то причине опубликованный мной пример XML-строки не работает так же, как живое подключение к документам Google. Единственный способ воспроизвести этот код — создать портфолио в Google Finance. Обязательно запишите идентификатор вашего портфолио. В моем примере я использую идентификатор портфеля 6 (finance/feeds/default/portfolios/6/positions), но у вас он может быть другим.

#Autheticate using RGoogleDocs
require(RGoogleDocs)
auth = getGoogleAuth("[email protected]", "password",service="finance")
con = getGoogleDocsConnection(auth)

#Get positions
positions <- getURL("http://finance.google.com/finance/feeds/default/portfolios/6/positions",curl=con)
doc = xmlTreeParse(positions, useInternalNodes = TRUE)
kids = xmlChildren(doc, addFinalizer = NA)
entries <- sapply(kids, "[", "entry")
entries[1]

person Zach    schedule 18.07.2011    source источник
comment
Пожалуйста, приведите воспроизводимый пример. Только у вас есть доступ к вашему портфолио, и у большинства людей, вероятно, нет портфолио Google Finance, которое они могли бы использовать для тестирования вашего кода.   -  person Joshua Ulrich    schedule 19.07.2011
comment
@Джошуа Ульрих: я обновил вопрос, как он теперь выглядит?   -  person Zach    schedule 19.07.2011
comment
Это все еще работает? [здесь][1] Я видел, что Google перестал предоставлять данные. [1]: stackoverflow.com/questions/11544287/oauth-with- Yahoo-финансы   -  person Suresh Gorakala    schedule 26.06.2014


Ответы (1)


Я сделал тестовое портфолио. После в основном ошибочных усилий и, наконец, рассмотрения класса объекта doc ниже и доступных методов, я наткнулся на эту стратегию, которая извлекает записи из портфеля GoogleFinance:

auth = getGoogleAuth("[email protected]", "yourpwd123",service="finance")
con = getGoogleDocsConnection(auth)

#Get positions
positions <- getURL("http://www.google.com/finance/portfolio?action=view&pid=1",curl=con)
   # Parse
doc = xmlTreeParse(positions, useInternalNodes = TRUE)
   # Convert to an R accessible form
kids = xmlChildren(doc, addFinalizer = NA)
   # access with `$` or "[" functions
entries <- sapply(kids, "[", "entry")
entries[1]   #  You may need to adjust this index if you get more than one 'entry'
person IRTFM    schedule 19.07.2011
comment
если я начну со строки позиции, которую я разместил выше, doc = xmlTreeParse(positions, useInternalNodes = TRUE) работает и kids = xmlChildren(doc, addFinalizer = NA) работает, но записи представляют собой пустой список. - person Zach; 19.07.2011
comment
У тебя есть что-нибудь с kids$feed ? Записи содержатся в узле ‹канала› - person IRTFM; 19.07.2011
comment
Хммм, я, должно быть, испортил пример XML, который я разместил. Ваш код отлично работает, когда я получаю данные прямо из Google Finance. - person Zach; 19.07.2011
comment
Да. Я заметил, что задействованы указатели, поэтому я думаю, что код должен быть выполнен таким образом, чтобы правильно их передавать. Я добавлю строку getURL (которую я скопировал из вашей настройки.) - person IRTFM; 19.07.2011
comment
Замечательно, работает отлично. Теперь мне просто нужно найти хороший способ преобразовать ленту записей во фрейм данных. - person Zach; 19.07.2011