在pandas DataFrame中为列接收NaN

时间:2015-08-30 13:18:14

标签: python pandas python-3.4

这是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

DataFrame

我知道代码不是你所说的最佳代码,但这些是书本练习,我试图通过实验来学习它们。

如果我只获取与Google相关的数据并制作数据框,则会显示实际数据:

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

Google DataFrame

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

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()

DataFrame all tickers

对于可能导致此问题的任何见解将不胜感激!

版本信息:

  • Python 3.4.2
  • pandas(0.16.2)
  • numpy(1.9.2)

2 个答案:

答案 0 :(得分:1)

谷歌现在有两类公开交易股票,C类(“GOOG”)于2014年发行,原始A股交易在“GOOGL”下。文章here包含更多信息。

所以要拥有所有4的完整历史记录,只需更改自动收报机即可。这也是数据“缺失”意味着什么的一个很好的例子。如果您想过滤这些原始4个代码的常见日期,您可以执行price = price.dropna()

答案 1 :(得分:1)

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

>>> 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

我怀疑潜在的原因是谷歌的RIC变化。他们已多次更改其股票结构以控制投票权等。因此,股票价格在特定日期之前没有为该股票标识符定义。

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