接收 pandas DataFrame 中列的 NaN

Receiving NaN for a column in pandas DataFrame

这是 O'Reilly 书中的一段代码(练习)Python for Data Analysis

from pandas import Series, DataFrame
import pandas.io.data as web

all_data = {}
for ticker in ['AAPL', 'IBM', 'MSFT', 'GOOG']:
    all_data[ticker] = web.get_data_yahoo(ticker)

price = DataFrame({k: v['Adj Close'] for k,v in all_data.items()})

奇怪的是,当我查看生成的 DataFrame 时,Google 的内容始终是 NaN:

我知道代码不是您所说的最佳代码,但这些是书本练习,我正在尝试通过实验从中学习。

如果我只获取与 Google 相关的数据并从中创建一个 DataFrame,则会出现实际数字:

DataFrame(all_data['GOOG']['Adj Close']).head()

但是当我尝试对所有股票代码做同样的事情时,它又出错了:

DataFrame([all_data['GOOG']['Adj Close'],
         all_data['AAPL']['Adj Close'],
         all_data['IBM']['Adj Close'],
         all_data['MSFT']['Adj Close']],
         index=['GOOG', 'AAPL', 'IBM', 'MSFT']).T.head()

任何有关可能导致此问题的见解都将不胜感激!

版本信息:

Google现有两只class上市股票,其中classC("GOOG")于2014年发行,原A股股票交易号为"GOOGL"。包含更多信息的文章 here

因此,要获得所有 4 个的完整历史记录,只需更改代码即可。这也是数据 "missing" 意味着什么的一个很好的例子。如果您想筛选出那些原始 4 个代码的共同日期,您可以 price = price.dropna()

您没有查看完整数据。看看你的两次重排中的日期。

>>> price.GOOG.isnull().sum()
1064

试试tail()

>>> price.GOOG.head()
Date
2010-01-04   NaN
2010-01-05   NaN
2010-01-06   NaN
2010-01-07   NaN
2010-01-08   NaN

>>> price.GOOG.tail()
Date
2015-08-24    589.609985
2015-08-25    582.059998
2015-08-26    628.619995
2015-08-27    637.609985
2015-08-28    630.380005

我怀疑根本原因是 google 更改了 RIC。他们多次更改股权结构以保持对投票权的控制等。因此在特定日期之前没有为该股票标识符定义股票价格。

使用像 Spyder 这样的 IDE 可能会有所帮助 - 您可以在类似 matlab 的方式中查看完整的数据帧,从而阻止这种事情的发生。