利用python进行数据分析
利用python进行数据分析 麦金尼 代码实测常见问题汇总
第1章 准备工作
IPython安装及使用:
- 开始菜单输入cmd进入命令行;
- 输入"pip install ipython"进行安装;
- 输入ipython进入IPython运行模式。
书中示例数据下载地址:
[ https://github.com/wesm/pydata-book/tree/1st-edition
](https://github.com/wesm/pydata-book/tree/1st-edition)
第2章 引言
本书使用的是python2.7版本,和python3语法有细微差别。
后面几章主要的代码问题都是python版本更新造成的方法淘汰和重新整合。
来自bit.ly的1.usa.gov数据
- print语法
In [20] :
print records[0]['tz']
改为
print(records[0]['tz'])
- pylab模式绘图
使用plot方法时要以pylab模式打开。
In [301]:
tz_counts[:10].plot(kind='barh', rot=0)
运行返回
<matplotlib.axes._subplots.AxesSubplot at 0x1b466aa06d8>
未弹出图像窗口;
在IPython运行下输入 pylab
打开pylab模式,然后重新运行 [301]成功绘图。
movielens 1m数据集
- pivot_table方法
原代码报错:
mean_ratings = data.pivot_table('rating', rows='title',cols='gender', aggfunc='mean')
错误信息为:
TypeError Traceback (most recent call last)
<ipython-input-87-683a0ab7c44d> in <module>
----> 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')
- ix函数警告
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函数进行查找。
- Series没有order函数
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]
1880-2010年间全美婴儿姓名
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
即可正确绘图。
第4章 numpy基础:数组和矢量计算
随机数生成
随机数生成出错
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)]
第5章 pandas入门
汇总和计算描述统计
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()})
其他有关pandas的话题
整数索引
使用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’
出错原因: 自己没有找到原因,修改了起止日期仍然无法读取数据,看了别的博主说是网络问题,暂未发现解决方法(有知道的大神可以在评论区留言)