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

Using .pivot() after saving and loading from CSV causes KeyError

我正在尝试从 Yahoo! 提取数据Finance for analysis,当我想从 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 数据采用以下格式,第一列包含所有代码:

您当前的 all_data_csv 代码将无法像 all_data 那样工作。这是 all_data 包含 MultiIndex 以及执行枢轴所需的所有信息这一事实的结果。

然而,在 all_data_csv 的情况下,唯一的索引是 Date。所以,我们需要做一些额外的工作才能让它发挥作用。

  1. 首先,重置 Date 索引
  2. Select 只有您需要的列 - ['Date', 'Ticker', 'Adj Close']
  3. 现在,以这些列为中心

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