从CSV保存和加载后使用.pivot()会导致KeyError

时间:2018-01-07 19:01:54

标签: python pandas dataframe pivot keyerror

我正试图从Yahoo!中提取数据用于分析的财务,当我想从CSV文件中读取而不是从Yahoo!下载时遇到问题每次我运行程序。

import pandas_datareader as pdr
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import datetime

def get(tickers, startdate, enddate):
    def data(ticker):
        return pdr.get_data_yahoo(ticker, start = startdate, end = enddate)
    datas = map(data, tickers)
    return(pd.concat(datas, keys = tickers, names = ['Ticker', 'Date']))

tickers = ['AAPL', 'MSFT', 'GOOG']

all_data = get(tickers, datetime.datetime(2006, 10,1), datetime.datetime(2018, 1, 7))
all_data.to_csv('data/alldata.csv')

#Open file
all_data_csv = pd.read_csv('data/alldata.csv', header = 0, index_col = 'Date', parse_dates = True)

daily_close = all_data[['Adj Close']].reset_index().pivot('Date', 'Ticker', 'Adj Close')

我遇到'daily_close'部分的问题。上面的代码可以正常使用直接来自网络的“all_data”。如何更改代码的底线,以便从我的csv文件中提取数据?我已经尝试了daily_close = all_data_csv[['Adj Close']].reset_index().pivot('Date', 'Ticker', 'Adj Close')但是由于'Ticker'而导致KeyError。

csv数据采用以下格式,第一列包含所有代码:

enter image description here

1 个答案:

答案 0 :(得分:1)

all_data_csv的当前代码不会像all_data那样有效。这是因为all_data包含MultiIndex,其中包含执行枢轴所需的所有信息。

但是,在all_data_csv的情况下,唯一的索引是Date。因此,我们需要做一些额外的工作才能使其发挥作用。

  1. 首先,重置Date索引
  2. 仅选择您需要的列 - ['Date', 'Ticker', 'Adj Close']
  3. 现在,转向这些列
  4. c = ['Date', 'Ticker', 'Adj Close']
    daily_close = all_data_csv.reset_index('Date')[c].pivot(*c)
    
    daily_close.head()
    
    Ticker          AAPL        GOOG       MSFT
    Date                                       
    2006-10-02  9.586717  199.422943  20.971155
    2006-10-03  9.486828  200.714539  20.978823
    2006-10-04  9.653308  206.506866  21.415722
    2006-10-05  9.582876  204.574448  21.400393
    2006-10-06  9.504756  208.891357  21.362070