IPython安装及使用:
书中示例数据下载地址:
https://github.com/wesm/pydata-book/tree/1st-edition
本书使用的是python2.7版本,和python3语法有细微差别。
后面几章主要的代码问题都是python版本更新造成的方法淘汰和重新整合。
In [20] :
print records[0]['tz']
改为
print(records[0]['tz'])
使用plot方法时要以pylab模式打开。
In [301]:
tz_counts[:10].plot(kind='barh', rot=0)
运行返回
未弹出图像窗口;
在IPython运行下输入 pylab
打开pylab模式,然后重新运行 [301]成功绘图。
原代码报错:
mean_ratings = data.pivot_table('rating', rows='title',cols='gender', aggfunc='mean')
错误信息为:
TypeError Traceback (most recent call last)
in
----> 1 mean_ratings = data.pivot_table('rating', rows='title',cols='gender', aggfunc='mean')
TypeError: pivot_table() got an unexpected keyword argument 'rows'
将代码修改为:
mean_ratings = data.pivot_table('rating', index='title',columns='gender', aggfunc='mean')
In[347]:
mean_ratings = mean_ratings.ix[active_titles]
出现如下警告:
DeprecationWarning:
.ix is deprecated. Please use
.loc for label based indexing or
.iloc for positional indexing
可以使用ix函数已经被loc和iloc函数替代,其中loc函数是使用标签进行的索引,而iloc函数是使用位置即行列号进行的索引,所以在此处可以使用loc函数进行查找。
In [358]:
rating_std_by_title.order(ascending=False)[:10]
属于报错,错误信息如下:
AttributeError: 'Series' object has no attribute 'order'
由于Series没有order函数,可以使用sort_valuesh()函数对得分标准差进行排序:
rating_std_by_title.sort_values(ascending=False)[:10]
diversity.plot绘图出错
In [402]:
diversity.plot(title="Number of popular names in top 50%")
错误类型为:
TypeError: Empty 'DataFrame': no numeric data to plot
错误原因出现在前面的get_quantile_count函数:
def get_quantile_count(group, q=0.5):
group = group.sort_index(by='prop',ascending=False)
return group.prop.cumsum().searchsorted(q) + 1
该函数最后一句group.prop.cumsum().searchsorted(q)
返回的是ndarray中的数组而不是浮点数,因此不能正确绘图。
解决方法是使用索引将数组中的数值取出:
def get_quantile_count(group, q=0.5):
group=group.sort_values(by='prop',ascending=False)
return group.prop.cumsum().searchsorted(q)[0] + 1
即可正确绘图。
随机数生成出错
In [212]:
%timeit samples = [normalvariate(0, 1) for _ in xrange(N)]
代码报错:
NameError: name 'xrange' is not defined
错误原因是Python 3中,range()与xrange()合并为range( )。将原始代码改为:
%timeit samples = [normalvariate(0, 1) for _ in range(N)]
pandas.io.data模块导入出错
import pandas.io.data as web
代码报错:
ModuleNotFoundError: No module named 'pandas.io.data'
出错原因:pandas.io.data模块已经迁移到pandas-datareader模块,将原始代码改为:
import pandas_datareader.data as web
data.iteritems()调用出错
price = DataFrame({tic:data['Adj Close'] for tic, data in all_data.iteritems()})
代码报错:
AttributeError: 'dict' object has no attribute 'iteritems'
出错原因:
python3中data没有iteritems属性,改为items,将原始代码改为:
price = DataFrame({tic:data['Adj Close'] for tic, data in all_data.items()})
使用Series的iget_value方法报错
In [293]:
ser3.iget_value(2)
代码报错:
AttributeError: 'Series' object has no attribute 'iget_value'
出错原因:iget_value()函数已被iat[]函数替代,将原始代码改为:
ser3.iat[2]
使用DataFrame的irow方法报错
In [295]:
frame.irow(0)
代码报错:
'DataFrame' object has no attribute 'irow'
出错原因:irow方法和icol方法已经被淘汰,可以使用iloc[:, i]选取列,使用iloc[i, :]选取行,将原始代码改为:
frame.iloc[0,:]
使用get_data_yahoo方法报错
pdata = pd.Panel(dict((stk,web.get_data_yahoo(stk,‘1/1/2009’,‘6/1/2012’))
for stk in [‘AAPL’,‘GOOG’,‘MSFT’,‘DELL’]))
代码报错:
KeyError: ‘Date’
出错原因:自己没有找到原因,修改了起止日期仍然无法读取数据,看了别的博主说是网络问题,暂未发现解决方法(有知道的大神可以在评论区留言)