本文实例讲述了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