本文实例讲述了python学习笔记之pandas索引列、过滤、分组、求和功能。分享给大家供大家参考,具体如下:
解析html内容,保存为csv文件
http://www.zzvips.com/article/174764.html
前面我们已经把519961(基金编码)这种基金的历史净值明细表html内容抓取到了本地,现在我们还是需要 解析html,取出相关的值,然后保存为csv文件以便pandas
来统计分析。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
from bs4 import beautifulsoup import os import csv # 使用 beautifulsoup 解析html内容 def getfunddetaildata(html): soup = beautifulsoup(html, "html.parser" ) rows = soup.find( "table" ).tbody.find_all( "tr" ) result = [] for row in rows: tds = row.find_all( 'td' ) result.append({ "fcode" : '519961' , "fdate" : tds[ 0 ].get_text() , "nav" : tds[ 1 ].get_text() , "accnav" : tds[ 2 ].get_text() , "dgr" : tds[ 3 ].get_text() , "pstate" :tds[ 4 ].get_text() , "rstate" : tds[ 5 ].get_text() } ) return result # 把解析之后的数据写入到csv文件 def writetocsv(): data_dir = "../htmls/details" all_path = os.listdir(data_dir) all_result = [] for path in all_path: if os.path.isfile(os.path.join(data_dir,path)): with open (os.path.join(data_dir,path), "rb" ) as f: content = f.read().decode( "utf-8" ) f.close() all_result = all_result + getfunddetaildata(content) with open ( "../csv/519961.csv" , "w" ,encoding = "utf-8" ,newline = "") as f: writer = csv.writer(f) writer.writerow([ 'fcode' , 'fdate' , 'nav' , "accnav" , 'dgr' , 'pstate' , "rstate" ]) for r in all_result: writer.writerow([r[ "fcode" ], r[ "fdate" ], r[ "nav" ], r[ "accnav" ], r[ "dgr" ], r[ "pstate" ], r[ "rstate" ]]) f.close() |
1
2
|
# 执行 writetocsv() |
pandas 排序、索引列
1
2
3
4
5
6
7
|
# coding: utf-8 import pandas if __name__ = = "__main__" : # 读取csv文件 创建pandas对象 pd = pandas.read_csv( "./csv/519961.csv" , dtype = { "fcode" :pandas.np.str_}, index_col = "fdate" ) # 把 fdate 这列设置为 索引列 # 根据索引列 倒序 print (pd.sort_index(ascending = false)) |
既然fdate
列设置为了索引列,那么如果根据索引获取呢?
1
2
3
4
|
# 读取csv文件 创建pandas对象 pd = pandas.read_csv( "./csv/519961.csv" , dtype = { "fcode" :pandas.np.str_}, index_col = "fdate" ) # 把 fdate 这列设置为 索引列 pd.index = pandas.to_datetime(pd.index) print (pd[ "2017-11-29 " ]) # 2017-11-29 519961 1.189 1.189 -1.00% 限制大额申购 开放赎回 |
2、直接指定fdate
列就是日期类型
1
2
3
|
# 读取csv文件 创建pandas对象 pd = pandas.read_csv( "./csv/519961.csv" , dtype = { "fcode" :pandas.np.str_}, index_col = "fdate" , parse_dates = [ "fdate" ]) # 指明fdate是日期类型 print (pd[ "2017-11-29 " ]) # 2017-11-29 519961 1.189 1.189 -1.00% 限制大额申购 开放赎回 |
打印索引:
1
|
print (pd.index) # 打印 索引 |
可以看出是datetimeindex
的索引:
1
2
3
4
5
6
7
8
|
datetimeindex([ '2015-08-13' , '2015-08-12' , '2015-08-11' , '2015-08-10' , '2015-08-07' , '2015-08-06' , '2015-08-05' , '2015-08-04' , '2015-08-03' , '2015-07-31' , ... '2015-07-02' , '2015-07-01' , '2015-06-30' , '2015-06-29' , '2015-06-26' , '2015-06-25' , '2015-06-24' , '2015-06-23' , '2015-06-19' , '2015-06-18' ], dtype = 'datetime64[ns]' , name = 'fdate' , length = 603 , freq = none) |
3、索引的高级用法
1
2
3
4
5
6
7
8
9
|
# 取出 2017年7月的 全部数据 print (pd[ "2017-07" ]) # 取出 2017年7月到9月的 数据 print (pd[ "2017-07" : "2017-09" ]) # 到2015-07的数据 print (pd[: "2015-07" ]) # 取出截至到2015-07的数据 # 然后 倒序 print (pd[: "2015-7" ].sort_index(ascending = false)) |
获取基金日增长率下跌次数最多的月份
1
2
3
4
5
6
7
8
|
result = pd[pd[ "dgr" ].notnull()] # dgr一定要有值 # 过滤掉dgr值里的%号,最后取出小于0的值(负数就表示增长率下跌了 ) result = result[result[ 'dgr' ]. str .strip( "%" ).astype(pandas.np. float )< 0 ] # 按照月份 统计dgr跌的次数 result = result.groupby( lambda d:d.strftime( "%y-%m" )).size() # 对dgr跌的次数 倒序,然后取出前面第一个 result = result.sort_values(ascending = false).head( 1 ) print (result) # 2016-04 12 意思就是2016年4月份 是该基金dgr下跌次数最多的月份 |
希望本文所述对大家python程序设计有所帮助。
原文链接:https://blog.csdn.net/github_26672553/article/details/78676520