这是菜鸟学Python的第83篇原创文章
阅读本文大概需要4分钟
前面几篇文章讲了很多零零碎碎的知识点,有同学抱怨说,你的数据量太少了,比如上一篇的基金和房价啊,好今天我们就来一个稍微大一点的数据集,我爬去了某财经网站的1000只基金的,累计20W交易日数据,然后做了简单的分析,我们希望知道周一到周五哪一天定投买基金最划算,也就是说我们要统计出周一到周五哪一天跌的概率最大
数据集:
基金一共有6500多只基金,我现在先取其中的1000只基金, 全年的交易数据,然后用Pandas分析,大家猜猜看哪一天的买最划算(今天这个实例用到前面所学的很多知识,算是一个小的综合练习吧)
数据收集
数据清洗
数据存储
数据分析
1.数据的收集
1).数据的收集我们采用爬虫去爬取,爬虫的库很多,我比较喜欢用requests,据说这个库是最人性化的爬虫库。(关于爬虫的知识网上很多,我这边就不对requests库展开介绍,大家可以自行去网上查一下).我们从某财经网站爬取数据,我们要获取基金的交易数据长这样:
2).我们只获取2个元素:日期,净值增长率
3).我们输入网站的url,开始时间和截止时间
用requests获取网站内容,记住我们把编码改成utf-8,不然会有乱码
4).然后分析一下网页,发现我们要的数据其实藏在里面,我们用BeautifulSoup去处理数据,BS用起来比较方便,但是速度很慢一些,如果要快的话,大家也可以用lxml库去解析html.
5).用BS的find_all获取所有的,然后对里面的内容进行解析
2.数据的清洗
拿到数据之后,我们要进行清洗,去掉一些杂质,提取我们想要的数据。因为我们要计算星期几,所以还需要对应的写一个函数来把日期转成星期,用datatime就可以了(datetime我前面文章讲的非常详细,大家可以自己翻一下历史文章都说Python时间处理很好玩还简单,真的吗)
3.数据的存储
我们把处理之后的数据,需要存起来,有很多方法可以处理,我们可以存到数据库里面,Sqlite,Mongodb,Sql都可以,也可以存成文件json,csv,excel都可以.这些数据的处理我前面都讲过,这里我用一个比较简单的方法存成csv文件吧.
然后存的csv文件长这样:
4.数据的分析
好下面进入我们最精彩的地方,前面都是铺垫,现在数据已经在我们手上了,我们可以随需所欲的挖掘数据的秘密了,怎么挖掘呢,当然是我们的主角要登场了,Pandas呀,我们前面几篇文章一直都在讲Pandas,好下面快来看看如何处理吧
1). 读取CSV文件
pandas有一个非常强大的库read_csv(file),可以直接把csv文件转成DateFrame数据结构,非常方便
2).利用DataFrame对数据进行处理
比如我们前面爬虫一个基金110011的数据,经过前面几步,可以获得数据如下:
比如:全年一共是264个的交易数据
易方达中小盘混合(110011)_基金净值_财经_凤凰网
264
Total fund: 1
date rate(%) fund_value weekday
0 2017-05-24 -0.53 3.5416 3
1 2017-05-23 0.55 3.5606 2
2 2017-05-22 0.16 3.5410 1
3 2017-05-19 1.08 3.5352 5
4 2017-05-18 -0.29 3.4974 4
5 2017-05-17 -1.16 3.5075 3
。。。
261 2016-04-28 0.08 2.4802 4
262 2016-04-27 0.02 2.4783 3
263 2016-04-26 0.58 2.4779 2
[264 rows x 4 columns]
获取的是一个264*4大的表数据
3).日期处理
目前我们的date是第二列,我们需要做一些数据处理,把date作为index,我们用pandas非常强大的to_datetime函数
df['date']=pd.to_datetime(df['date'])
#把日期作为index
df=df.set_index('date')
rate(%) fund_value weekday
date
2017-05-24 -0.53 3.5416 3
2017-05-23 0.55 3.5606 2
2017-05-22 0.16 3.5410 1
2017-05-19 1.08 3.5352 5
2017-05-18 -0.29 3.4974 4
看日期变成了index了吧,有同学说为啥要这样处理呢,因为后面有很多操作都是跟时间相关的,比如我们要提取周线,月线,等等
4).看一下1年有多少天是跌的
统计基金净值增长率<0就可以了
df_price_decline=df[df['rate(%)']<0]
为了显示方便我们取前5个
rate(%) fund_value weekday
date
2017-05-24 -0.53 3.5416 3
2017-05-18 -0.29 3.4974 4
2017-05-17 -1.16 3.5075 3
2017-05-10 -0.24 3.3885 3
2017-05-08 -1.17 3.3945 1
5.Pandas进一步分析
然后我们需要用到Pandas里面一个非常重要的功能,分组功能,这个功能非常强大,后面我会写一篇文章专门介绍,这里我们先简单运用一下.
我们对weekday进行分组,然后统计出周一到周五,每天都跌的次数
比如:我们把基金的时间取最近一个月的交易日的数据:s_date,e_date='2017-4-25','2017-5-24'
weekday_df=df_price_decline.groupby('weekday')
print weekday_df
>>
rate(%) fund_value weekday
date
2017-05-24 -0.53 3.5416 3
2017-05-18 -0.29 3.4974 4
2017-05-17 -1.16 3.5075 3
2017-05-10 -0.24 3.3885 3
2017-05-08 -1.17 3.3945 1
2017-05-04 -0.27 3.4343 4
2017-04-28 -0.74 3.4117 5
2017-04-26 -0.65 3.4349 3
统计出weekday
print weekday_df.size()
>>
weekday
1 1
3 4
4 2
5 1
dtype: int64
发现近一个月:
星期一:跌1次
星期二:跌0次
星期三:跌4次
星期五:跌1次
很明显星期三跌的次数多,也就是概率很大,这只是一个基金最近1个月的数据,我们同理取获取1年的数据,并且抽取1000来只基金的数据,看看是什么情况呢
#排序一个,并取第一个
print weekday_df.size().sort_values(ascending=False)
>>
weekday
3 4
4 2
5 1
1 1
dtype: int64
#获取跌的天数最多的那个
print weekday_df.size().sort_values(ascending=False).head(1)
>>
weekday
3 4
dtype: int64
top_weekday_price_decline.index[0]就是我们返回的跌幅最多的天数
-1表示有一些基金有一些基金爬取的数据是0
比如:
易方达天天理财货币A(000009)_基金净值_财经_凤凰网
0
易方达天天理财货币B(000010)_基金净值_财经_凤凰网
0
6.1000只基金,全年的交易数据
前面的代码框架基本已经成型,然后把s_date,e_date改为'2016-4-25','2017-5-24',取1年内的数据,用另外一个爬虫取1000只基金,把返回的天数放到一个列表里面,用Counter统计一下就可以了
运行结果:
华夏成长混合(000001)_基金净值_财经_凤凰网
264
中海可转债债券A(000003)_基金净值_财经_凤凰网
264
中海可转债债券C(000004)_基金净值_财经_凤凰网
264
嘉实增强信用定期债券(000005)_基金净值_财经_凤凰网
264
鹏华国企债债券(000007)_基金净值_财经_凤凰网
264
。。。
东方红稳健精选混合A(001203)_基金净值_财经_凤凰网
263
东方红稳健精选混合C(001204)_基金净值_财经_凤凰网
263
建信稳健回报灵活配置混合(001205)_基金净值_财经_凤凰网
264
广发聚惠混合A(001206)_基金净值_财经_凤凰网
264
Total fund: 1000
[(5, 356), (3, 238), (2, 133), (4, 29), (1, 28)]
也就是说1000只基金里面有星期五跌的356次,看来周五是个好的买入时间,但是随着样本数变多,相信结果还是会变的~~当然也可以对某只基金进行分析,或者某一类比股票型,混合型这样会更近准
好了Pandas综合小练习就到这里了,这个代码是静态爬虫,我没有用多线程,也没有用爬虫框架去做,因为爬1000只基金数据分析大概只要7分钟,后面我会再写一篇用多线程去爬,这样会快很多。数据分析的大门已经逐渐打开,随着数据分析教程的深入,后面还会有更多好玩的数据分析案例,我会穿插在教程中讲,敬请期待~~
更多精彩内容,源码分享,请关于微信公众号"菜鸟学python"
历史人气文章
网友评论