从 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
。所以,我们需要做一些额外的工作才能让它发挥作用。
- 首先,重置
Date
索引
- Select 只有您需要的列 -
['Date', 'Ticker', 'Adj Close']
- 现在,以这些列为中心
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
我正在尝试从 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'.
csv 数据采用以下格式,第一列包含所有代码:
您当前的 all_data_csv
代码将无法像 all_data
那样工作。这是 all_data
包含 MultiIndex
以及执行枢轴所需的所有信息这一事实的结果。
然而,在 all_data_csv
的情况下,唯一的索引是 Date
。所以,我们需要做一些额外的工作才能让它发挥作用。
- 首先,重置
Date
索引 - Select 只有您需要的列 -
['Date', 'Ticker', 'Adj Close']
- 现在,以这些列为中心
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