对于按列填充数据帧的循环不起作用

时间:2017-12-22 13:10:48

标签: python api pandas for-loop dataframe

我有一个for循环,它位于Python中面向对象的程序中。

  1. 首先,函数get_data发出API请求,以检索上面列表符号中每个符号的信息。
  2. 其次,函数extract_data(self,response,symbol)具有参数响应,该参数响应是API请求的结果,以及我与调试模块一起用于跟踪for循环的参数符号。
  3. for循环从API中提取数据,最后将其附加到名为 tickers 的列表中。

    symbols = ["ETHBTC","LTCBTC","BNBBTC","NEOBTC"]
    
    def __init__(self,interval):
        self.interval = interval
        for symbol in symbols:
            ohlc = self.get_data(symbol)
            self.extract_data(ohlc,symbol)
    
    
    def extract_data(self,response,symbol):
    
        all_tickers = pd.DataFrame()
    
        tickers = []
        data = response.json()      
    
        for item in data:
            open_ = item[1]
            high =  item[2]
            low =  item[3]
            close = item[4]
            volume = float(item[5])
            timestamp = item[6]
            timestamp = timestamp / 1000
            date = datetime.datetime.fromtimestamp(timestamp=timestamp).strftime('%Y-%m-%d')
            tickers.append({"close":close,"date":date})
    
        logging.debug("Download {} day prices of ohlc data from {} pair".format(len(tickers),symbol))
        all_tickers = all_tickers.append(pd.DataFrame(tickers))
    

    我已尝试多次使用不同的结构来制作数据框,每个列中每个资产的价格和日期作为索引,但目前我无法达到解决方案。

    非常欢迎一些建议或建议。

1 个答案:

答案 0 :(得分:0)

几步 - 首先修改extract_data以返回所需数据的元组列表,包括符号

def extract_data(self,response,symbol):
    tickers = []
    ... 

    for item in data:
        ...
        tickers.append((close, date, symbol))

    ...

    return tickers

然后,当你遍历你的符号时,创建一个" master"列表。

data = []
for symbol in symbols:
    ohlc = self.get_data(symbol)
    symb_data = self.extract_data(ohlc,symbol)
    data = data + symb_data

应该以

之类的东西结束
[(45, datetime.date(2017, 12, 23), 'ETHBTC'),
 (46, datetime.date(2017, 12, 24), 'ETHBTC'),
 (47, datetime.date(2017, 12, 23), 'LTCBTC'),
 (48, datetime.date(2017, 12, 24), 'LTCBTC'),
 (49, datetime.date(2017, 12, 23), 'BNBBTC'),
 (50, datetime.date(2017, 12, 24), 'BNBBTC'),
 (51, datetime.date(2017, 12, 23), 'NEOBTC'),
 (52, datetime.date(2017, 12, 24), 'NEOBTC')]

最后创建数据框并转动表

df = (pd.DataFrame(data, 
                   columns=["close", "date", "ticker"])
      .pivot(index="date", 
             columns="ticker", 
             values="close"))

print(df)

获得

ticker      BNBBTC  ETHBTC  LTCBTC  NEOBTC
date                                      
2017-12-23      49      45      47      51
2017-12-24      50      46      48      52