2017-05-13 14:25:19 ppd0705 阅读数 1075
  • 专家实力科普:学Python的五用武之地!

    Python技术入门科普视频教程,该课程会告诉大家Python的应用领域、Python语言特点、应用框架、架构、如何入门Python、Python爬虫开发、利用Python进行数据挖掘、进行深度学习开发。通过本次直播,学员能够对Python有一个完整、系统的了解,能够帮助同学更好的对自身做出定位。

    842 人正在学习 去看看 CSDN讲师

注:使用软件版本为anaconda3-4-3.1

#python常用基础包
import matplotlib.pyplot as plt
import pylab as py
import math as m
import scipy.stats as stats
import numpy as np
import pandas as pd
#加载1880年的数据,并以name、sex、births为列
names1880=pd.read_csv('names/yob1880.txt',names=['name','sex','births'])
names1880.head()
  name sex births
0 Mary F 7065
1 Anna F 2604
2 Emma F 2003
3 Elizabeth F 1939
4 Minnie F 1746
#计算1880年男女出生人数(以sex为行,对births求和)
names1880.groupby(['sex']).births.sum()
# names1880.groupby(['sex']).sum()
sex
F     90993
M    110493
Name: births, dtype: int64
#将历年数据整合并添加‘year’列
years=range(1880,2011)
pieces=[]
columns=['name','sex','births']
for year in years:
    path='names/yob%d.txt' %year
    frame=pd.read_csv(path,names=columns)
    frame['year']=year
    pieces.append(frame)
names=pd.concat(pieces,ignore_index=True) 
names.head()
  name sex births year
0 Mary F 7065 1880
1 Anna F 2604 1880
2 Emma F 2003 1880
3 Elizabeth F 1939 1880
4 Minnie F 1746 1880
#按年份统计男女的总出生人数
total_births=names.pivot_table('births',index='year',columns='sex',aggfunc=sum)
#total_births.head()
total_births.plot()
plt.show()
#添加每年每个名字在对应性别中的比例
def add_prop(group):
    births=group.births
    group['prop']=births/births.sum()
    return group
names=names.groupby(['year','sex']).apply(add_prop)
names.head()
  name sex births year prop
0 Mary F 7065 1880 0.077643
1 Anna F 2604 1880 0.028618
2 Emma F 2003 1880 0.022013
3 Elizabeth F 1939 1880 0.021309
4 Minnie F 1746 1880 0.019188
#验证累加出生率是否为1
np.allclose(names.groupby(['year','sex']).prop.sum(),1)
True
#选取排名前1000的名字
def get_top1000(group):
    return group.sort_values(by='births',ascending=False)[:1000]
grouped=names.groupby(['year','sex'])
top1000=grouped.apply(get_top1000)
top1000.head()
      name sex births year prop
year sex            
1880 F 0 Mary F 7065 1880 0.077643
1 Anna F 2604 1880 0.028618
2 Emma F 2003 1880 0.022013
3 Elizabeth F 1939 1880 0.021309
4 Minnie F 1746 1880 0.019188
#可将数据进一步按性别分为两部分
boys=top1000[top1000.sex=='M']
girls=top1000[top1000.sex=='F']
boys.tail(2)
      name sex births year prop
year sex            
2010 M 1677642 Jaydan M 194 2010 0.000102
1677645 Maxton M 193 2010 0.000102
#以year为行、name为列做表
total_births=top1000.pivot_table('births',index='year',columns='name',aggfunc=sum)
total_births.head(2)
name Aaden Aaliyah Aarav Aaron Aarush Ab Abagail Abb Abbey Abbie ... Zoa Zoe Zoey Zoie Zola Zollie Zona Zora Zula Zuri
year                                          
1880 NaN NaN NaN 102.0 NaN NaN NaN NaN NaN 71.0 ... 8.0 23.0 NaN NaN 7.0 NaN 8.0 28.0 27.0 NaN
1881 NaN NaN NaN 94.0 NaN NaN NaN NaN NaN 81.0 ... NaN 22.0 NaN NaN 10.0 NaN 9.0 21.0 27.0 NaN

2 rows × 6868 columns

#分析指定名字的命名趋势
subset=total_births[['John','Harry','Mary','Marilyn']]
subset.plot(subplots=True,figsize=(12,10),grid=False,title="Number of births per year")
plt.show()
#评估历年命名多样性的增长
table=top1000.pivot_table('prop',index='year',columns='sex',aggfunc=sum)
table.plot(yticks=np.linspace(0,1.2,13),xticks=range(1880,2040,10),title='Sum of top1000.prop by year and sex',grid=False,figsize=(10,5))
plt.show()
#统计2010年男孩中前多少个名字占了50%的比例
df=boys[boys.year==2010]
prop_comsum=df.prop.cumsum()
prop_comsum.values.searchsorted(0.5)
116
#统计历年前多少个名字占了50%的比例
def get_quantile_count(g):
    d=g.prop.cumsum().values.searchsorted(0.5)+1
    return d
diversity=top1000.groupby(['year','sex']).apply(get_quantile_count)
diversity=diversity.unstack('sex')
diversity.plot(title='Number of popular names in top 50%')
plt.show()
#指定年份名字最后一个字母分别为a、b、c...的数量
get_last_letter=lambda x:x[-1]
last_letters=names.name.map(get_last_letter)
last_letters.name='last_letter'
table=names.pivot_table('births',index=last_letters,columns=['sex','year'],aggfunc=sum)
subtable=table.reindex(columns=[1910,1960,2010],level='year')
subtable.head()
sex F M
year 1910 1960 2010 1910 1960 2010
last_letter            
a 108376.0 691247.0 670605.0 977.0 5204.0 28438.0
b NaN 694.0 450.0 411.0 3912.0 38859.0
c 5.0 49.0 946.0 482.0 15476.0 23125.0
d 6750.0 3729.0 2607.0 22111.0 262112.0 44398.0
e 133569.0 435013.0 313833.0 28655.0 178823.0 129012.0
#指定年份名字最后一个字母分别为a、b、c...的比例
letter_prop=subtable/subtable.sum()
letter_prop.head()
sex F M
year 1910 1960 2010 1910 1960 2010
last_letter            
a 0.273390 0.341853 0.381240 0.005031 0.002440 0.014980
b NaN 0.000343 0.000256 0.002116 0.001834 0.020470
c 0.000013 0.000024 0.000538 0.002482 0.007257 0.012181
d 0.017028 0.001844 0.001482 0.113858 0.122908 0.023387
e 0.336941 0.215133 0.178415 0.147556 0.083853 0.067959
#指定年份名字最后一个字母分别为a、b、c...的比例的条形图
fig,axes=plt.subplots(2,1,figsize=(20,12))
letter_prop['M'].plot(kind='bar',ax=axes[0],rot=0,title='Male')
letter_prop['F'].plot(kind='bar',rot=0,ax=axes[1],title='Female',legend=False)
plt.show()
#双重索引提取历年男孩中名字末字母为d、n、y的比例
letter_prop2=table/table.sum()
dny_ts=letter_prop2.ix[['d','n','y'],'M'].T
dny_ts.head()
last_letter d n y
year      
1880 0.083055 0.153213 0.075760
1881 0.083247 0.153214 0.077451
1882 0.085340 0.149560 0.077537
1883 0.084066 0.151646 0.079144
1884 0.086120 0.149915 0.080405
#上表的条形图
dny_ts.plot()
plt.show()
#统计包含‘lesl'字段的名字
all_names= top1000.name.unique()
mask=np.array(['lesl' in x.lower() for x in all_names])
lesley_like=all_names[mask]
lesley_like
array(['Leslie', 'Lesley', 'Leslee', 'Lesli', 'Lesly'], dtype=object)
#各名字总出数量
filtered=top1000[top1000.name.isin (lesley_like)]
filtered.groupby('name').births.sum()
name
Leslee      1082
Lesley     35022
Lesli        929
Leslie    370429
Lesly      10067
Name: births, dtype: int64
#名字含'lesl'的历年人数
table2=filtered.pivot_table('births',index='year',columns='sex',aggfunc=sum)
table2.head()
sex F M
year    
1880 8.0 79.0
1881 11.0 92.0
1882 9.0 128.0
1883 7.0 125.0
1884 15.0 125.0
#男孩女孩名字含'lesl'的历年人数比例
table2=table2.div(table2.sum(1),axis=0)
table2.head()
sex F M
year    
1880 0.091954 0.908046
1881 0.106796 0.893204
1882 0.065693 0.934307
1883 0.053030 0.946970
1884 0.107143 0.892857
#名字含'lesl'的历年比例趋势,可见这个名字由男孩名变成了女孩名!
table2.plot(style={'M':'k-','F':'k--'})
plt.show()

2018-08-16 06:10:05 qq_41072222 阅读数 967
  • 专家实力科普:学Python的五用武之地!

    Python技术入门科普视频教程,该课程会告诉大家Python的应用领域、Python语言特点、应用框架、架构、如何入门Python、Python爬虫开发、利用Python进行数据挖掘、进行深度学习开发。通过本次直播,学员能够对Python有一个完整、系统的了解,能够帮助同学更好的对自身做出定位。

    842 人正在学习 去看看 CSDN讲师

摘要:

由于《利用Python进行数据分析》是基于Python2.7版本编写的,而随着Python3.x的普以及pandas的版本迭代(目前的版本号为:0.23.4)。,这本六年前出版(第一版出版于2012年)的书却迟迟没有更新,在使用的时候难免会遇到一些障碍,所以我将在学习这本书的过程中遇到的问题和解决办法以及学习学习笔记都分享给大家。给之后阅读这本书的读者更够一个参考,少走一些弯路。我在重写本书代码时遇到的各种问题都会分章节的给大家解决。作者第一次写技术类博客,而且时间和精力有限,文中错误比较多,若读者们发现错谬之处,请不吝告知,以免误导他人。


第二章:引言

Movielens 1M

  1. top_female_ratings=mean_ratings.sort_index(by='F',ascending=False)
    FutureWarning: by argument to sort_index is deprecated, please use .sort_values(by=…)
    解决办法:用.sort_values(by=…)替换.sort_index(by=…)。

  2. mean_ratings=data.pivot_table('rating',rows='title',cols='gender',aggfunc='mean)
    可能pandas版本的原因,现在版本的.pivot_table()没有rows,cols参数。
    解决方法:
    将代码改为mean_ratings=data.pivot_table('rating',index='title',columns='gender',aggfunc='mean')
    参考文献:
    pandas官网文档链接
    《利用Python进行数据分析》第二章pivot_table报错问题

  3. rating_std_by_title.order(asending=False)[:10]#以上相同问题的补充
    Series没有order()函数
    解决方法:
    rating_std_by_title=rating_std_by_title.sort_values(ascending=False)[:10]
    使用.sort_values()对Series按值进行排序。
    方法扩展:

    print ('series通过索引进行排序:')
    series.sort_index()
    print ('series通过值进行排序:')
    series.sort_values()
    print ('dataframe根据行索引进行降序排序(排序时默认升序,调节ascending参数):')
    frame.sort_index(ascending=False)
    print ('dataframe根据列索引进行排序:')
    frame.sort_index(axis=1)
    print ('dataframe根据值进行排序:')
    frame.sort_values(by='a')
    print ('通过多个索引进行排序:')
    frame.sort_values(by=['a','c'])

参考文献:
《pandas学习:对series和dataframe进行排序》

1880-2010年间全美婴儿姓名

  1. names=pd.concat(pieces,ignore_index=True)
    笔记:
    concatenation
    n. 串联,连结
    这里需要注意几件事情:
    第一, concat默认是按行将多个 Dataframe组合到一起的;
    第二,必须指定 ignore_ index=True,因为我们不希望保留 read csv所返回的原始行号。
  2. total_births=names.pivot_table('births',rows='year',cols='sex',aggfunc=sum)
    TypeError: pivot_table() got an unexpected keyword argument ‘rows’
    解决方法:
    total_births=names.pivot_table('births',index='year',columns='sex',aggfunc=sum)
    参考文献:
    《利用Python进行数据分析》第二章pivot_table报错问题
  3. group.sort_index(by='births',ascending=False)[:1000]#以上相同问题的补充
    FutureWarning: by argument to sort_index is deprecated, please use .sort_values(by=…)
    我之后查阅了pandas的官方文档才知道:在新版的pandas中,对Series或者·Dataframe进行排序有两种方法。分别是
    .sort_index().sort_values()。其功能分别是按索引对Series或者Dataframe进行排序和按值进行排序。

  4. total_births=top1000.pibot_table('births',rows='year',cols='name',aggfunc=sum)
    TypeError: pivot_table() got an unexpected keyword argument ‘rows’
    解决方法:同上。
    total_births=top1000.pivot_table('births',index='year',columns='name',aggfunc=sum)

  5. diversity.plot(title='Number of popular names in top 50%')
    TypeError: Empty ‘DataFrame’: no numeric data to plot
    错误原因:
def get_quantile_count(group,q=0.5):
    group.sort_values(by='prop',ascending=False)
    return (group.prop.cumsum().searchsorted(q)+1)

(group.prop.cumsum().searchsorted(q)+1)
返回的是numpy数组(class <’numpy.ndarray’>),而不是浮点,因此不能进行绘图。
解决方法:应将numpy数组中的数据取出单独写入Dataframe。

def get_quantile_count(group,q=0.5):
    group.sort_values(by='prop',ascending=False)
    return (group.prop.cumsum().searchsorted(q)+1)[0]

参考文献:
Python数据分析示例(3)Day4

2019-02-05 17:45:42 zhinengxuexi 阅读数 516
  • 专家实力科普:学Python的五用武之地!

    Python技术入门科普视频教程,该课程会告诉大家Python的应用领域、Python语言特点、应用框架、架构、如何入门Python、Python爬虫开发、利用Python进行数据挖掘、进行深度学习开发。通过本次直播,学员能够对Python有一个完整、系统的了解,能够帮助同学更好的对自身做出定位。

    842 人正在学习 去看看 CSDN讲师

只要能解决实际问题,用什么工具来学习数据挖掘都是无所谓,这里首推Python。那该如何利用Python来学习数据挖掘?需要掌握Python中的哪些知识?
1、Pandas库的操作
Panda是数据分析特别重要的一个库,我们要掌握以下三点:
· pandas 分组计算;
· pandas 索引与多重索引;
索引比较难,但是却是非常重要的
· pandas 多表操作与数据透视表
2、numpy数值计算
numpy数据计算主要应用是在数据挖掘,对于以后的机器学习,深度学习,这也是一个必须掌握的库,我们要掌握以下内容:
· Numpy array理解;
· 数组索引操作;
· 数组计算;
· Broadcasting(线性代数里面的知识)
3、数据可视化-matplotlib与seaborn
· Matplotib语法
python最基本的可视化工具就是matplotlib。咋一看Matplotlib与matlib有点像,要搞清楚二者的关系是什么,这样学习起来才会比较轻松。
· seaborn的使用
seaborn是一个非常漂亮的可视化工具。
· pandas绘图功能
前面说过pandas是做数据分析的,但它也提供了一些绘图的API。
4、数据挖掘入门
这部分是最难也是最有意思的一部分,要掌握以下几个部分:
· 机器学习的定义
在这里跟数据挖掘先不做区别
· 代价函数的定义
· Train/Test/Validate
· Overfitting的定义与避免方法
5、数据挖掘算法
数据挖掘发展到现在,算法已经非常多,下面只需掌握最简单的,最核心的,最常用的算法:
· 最小二乘算法;
· 梯度下降;
· 向量化;
· 极大似然估计;
· Logistic Regression;
· Decision Tree;
· RandomForesr;
· XGBoost;
6、数据挖掘实战
通过机器学习里面最着名的库scikit-learn来进行模型的理解。
以上,就是为大家理清的大数据挖掘学习思路逻辑。可是,这还仅仅是开始,在通往数据挖掘师与数据科学家路上,还要学习文本处理与自然语言知识、Linux与Spark的知识、深度学习知识等等,我们要保持持续的兴趣来学习数据挖掘。
人工智能、大数据、云计算和物联网的未来发展值得重视,均为前沿产业,有兴趣的朋友,可以查阅多智时代,在此为你推荐几篇优质好文:
1.Python和R语言对比,数据分析与挖掘该选哪一个?
http://www.duozhishidai.com/article-21757-1.html
2.Python工程师与人工智能工程师之间,最根本的区别是什么?
http://www.duozhishidai.com/article-14635-1.html
3.为什么要学习Python,有哪些优缺点,应该如何上手?
http://www.duozhishidai.com/article-1784-1.html


多智时代-人工智能大数据学习入门网站|人工智能、大数据、物联网云计算的学习交流网站

多智时代-人工智能大数据学习入门网站|人工智能、大数据、云计算、物联网的学习服务的好平台
2018-03-24 20:44:28 qiebuliaoliao 阅读数 39
  • 专家实力科普:学Python的五用武之地!

    Python技术入门科普视频教程,该课程会告诉大家Python的应用领域、Python语言特点、应用框架、架构、如何入门Python、Python爬虫开发、利用Python进行数据挖掘、进行深度学习开发。通过本次直播,学员能够对Python有一个完整、系统的了解,能够帮助同学更好的对自身做出定位。

    842 人正在学习 去看看 CSDN讲师
2019-05-13 19:41:36 The_Time_Runner 阅读数 92
  • 专家实力科普:学Python的五用武之地!

    Python技术入门科普视频教程,该课程会告诉大家Python的应用领域、Python语言特点、应用框架、架构、如何入门Python、Python爬虫开发、利用Python进行数据挖掘、进行深度学习开发。通过本次直播,学员能够对Python有一个完整、系统的了解,能够帮助同学更好的对自身做出定位。

    842 人正在学习 去看看 CSDN讲师

学Python的时候没有看这本书,后来翻看一看,以前遇到过的哪些不清楚的函数,这里面都写了,而且作者本身造诣极高,说出来的话前后通达,理解透彻。

当成工具书,关于Python不知道的,先上来看看,至少明白问题在Python结构中处于哪方面,再去深入调查。

其实,常规使用来说,不需要研究的比这本书更透彻,就足够了。

比较有意思的就是,第二版封面动物的方向变了


《利用Python进行数据分析》

Wes McKinney

2018-7

机械工业出版社

没有更多推荐了,返回首页