如何使类从dict返回数据并将其放入数据帧?

2024-10-03 02:35:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我创建了一个从YahooFinancials返回历史价格的类。 但我在尝试重新使用函数get_ticker()时遇到了一些问题,因为它会导致except语句。来自雅虎的数据如下所示:

无法找出get\u ticker方法失败的原因。我的预期结果是,它应该返回一个数据帧,列名称为ticker,值为收盘价

{'NDA-SE.ST': {'eventsData': {'dividends': {'2019-03-24': {'amount': 0.69,
     'date': 1553846400,
     'formatted_date': '2019-03-29'}}},
  'firstTradeDate': {'formatted_date': '2018-10-03', 'date': 1538550000},
  'currency': 'SEK',
  'instrumentType': 'EQUITY',
  'timeZone': {'gmtOffset': 7200},
  'prices': [{'date': 1538344800,
    'high': 96.54000091552734,
    'low': 90.91000366210938,
    'open': 95.58000183105469,
    'close': 91.81999969482422,
    'volume': 27927817,
    'adjclose': 91.02266693115234,
    'formatted_date': '2018-09-30'},
   {'date': 1538949600,
    'high': 92.0999984741211,
    'low': 86.70999908447266,
    'open': 91.8499984741211,
    'close': 86.70999908447266,
    'volume': 55435408,
    'adjclose': 85.95703887939453,
    'formatted_date': '2018-10-07'}

from yahoofinancials import YahooFinancials
import pandas as pd

class Data(object):
    """docstring for ClassName"""
    def __init__(self,ticker, start, end,basis):
        self.ticker = ticker
        self.basis = basis
        self.start = start
        self.end = end

    def get_histocial_prices(self):
        ticker = self.ticker
        yahoo_financials = YahooFinancials(ticker)
        return yahoo_financials.get_historical_price_data(self.start, self.end, self.basis)

    def get_ticker(self, DATAFRAME):
        '''Gets historical DATA from a TICKER and given range, and then appends it to
        a DATAFRAME'''
        DATAFRAME = pd.DataFrame()
        hist_price = Data.get_histocial_prices(self)

        '''returns a returns a dict '''
        sample = hist_price

        '''Puts sample in Dataframe under each TICKER'''
        try:
            self.ticker = pd.DataFrame.from_dict(data=sample['prices'],orient='index')
            cols = ['close']
            self.ticker = self.ticker[cols]
            self.ticker = self.ticker.rename(columns={'close':self.ticker})
            if DATAFRAME.empty == True:
                DATAFRAME = DATAFRAME.append(self.ticker)
                print('First column')
                DATAFRAME.head()
                return DATAFRAME
            elif self.ticker in DATAFRAME:
                print(self.ticker, 'already in dataframe')
                return DATAFRAME

            else:
                DATAFRAME = pd.concat((DATAFRAME, self.ticker), axis=1, ignore_index=True, sort=True)
                print('Added:', self.ticker)
                return DATAFRAME
        except:
            print('NO DATA IN RANGE', self.ticker)
            return DATAFRAME

d = Data('NDA-SE.ST','2018-08-15', '2018-09-15', 'daily')

d.get_ticker('df')

Tags: selfdataframeclosegetdatereturnbasisstart