使用Python的 xlrd 来读取 基金收益率excel文件

编程入门 行业动态 更新时间:2024-10-10 00:26:59

使用Python的 xlrd 来读取 基金<a href=https://www.elefans.com/category/jswz/34/1749513.html style=收益率excel文件"/>

使用Python的 xlrd 来读取 基金收益率excel文件

背景:

2020年2月份所购P2P暴雷后,开始在某平台购买基金。7月份开始记录剩下基金的收益率,当前基金金额。然后2020年结束了,小赚了一丢丢,记录的excel数据就想利用起来,这些平时空闲时记录的数据,真实的反映了当时涨跌带来的心情的起起落落。顺便也来复习下 python,好久没碰了。

步骤:

1 开发环境准备:PyCharm CE + python3.8 + xlrd 2.0.1 

2. 清理和补充了记录的数据,去掉重复的标题栏,添加当时隐藏的已经清仓的基金项

3. 开始扣丁 

3.1 打开 excel

# 打开excel
data = xlrd.open_workbook("2020基金盘点Local_xls.xls")  # 打开excel工作簿
table = data.sheet_by_index(1)  # 打开基金标签页,序号从0开始!!
print(f'当前在: {table.name}标签页上')  # 获取标签页面名字
print(table.row_values(1))
countNo = table.row_values(1).count("持有收益")
print(f'当前统计了:{countNo}次收益记录')

P.s 这里面有个小坑,之前的文件格式是 xlsx 后缀的,发现在 用 xlrd 去打开时这一直报错,后面另存为 xls 后缀的就可以

3.2 读取到工作薄后,从下标是2开始读取(第0,第1是标题栏),得到基金代码列表 和 单个基金记录数据列表 备用 (P.s这块应该还能优化 或 抽成函数)

fundCode = ''  # 基金或产品代码
fundList = []  # 基金或产品列表
fundParams = []  # 空列表
for j in range(2, table.nrows):  # 每次取到每行的值dt_specificFund = table.row_values(j)fundCode = str(operator.itemgetter(0)(dt_specificFund))if fundCode != '':if '.' in fundCode:dot = fundCode.index('.')# print('第 ' + str(j-1) + ' 个 dt_' + fundCode[0:dot] + 's = []  # 基金名:' + table.row_values(j)[4])print('第 %2s 个 dt_%ss = []  # 基金名: %s' % (str(j - 1), fundCode[0:dot], table.row_values(j)[4]))fundList.append(fundCode[0:dot])fundParams.append('dt_' + fundCode[0:dot] + 's')else:# print('第 ' + str(j-1) + ' 个 dt_' + str(fundCode) + 's = []  # 基金名:' + table.row_values(j)[4])print('第 %2s 个 dt_%ss = []  # 基金名: %s' % (str(j - 1), str(fundCode), table.row_values(j)[4]))fundList.append(fundCode)fundParams.append('dt_' + fundCode + 's')
print('所有基金代码列表\n' + str(fundList))
print('所有单个基金的全部记录数据列表\n' + str(fundParams))

3.3 从 表格的第一行里 抽取 记录的日期。P.s 这里面日期的格式 最好不要写成 i.e Dec 7, 1st Dec, 支持使用 strftime函数 来指定日期格式,记住,Y,m,d只写一个,不同于 java ,yyyyMMdd, etc

# 取得第一行数据 里 日期数组成列表
dt_dates = []
dateRow = table.row_values(0)
for k in range(6, len(dateRow), 7):cell = dateRow[k]dt_date = datetime(*xldate_as_tuple(cell, 0))ce_date = dt_date.strftime('%Y/%m/%d')dt_dates.append(ce_date)

3.4 因为每个基金的记录数据列表我的命名规则是 dt_基金代码s, i.e dt_161028s

# 写一个类,定义类方法来处理
class FundDataGeneration:"""一个用于生成数据的类"""rowNo = 0fundCodeList = []# 定义构造方法def __init__(self, no, ls):# no 是基金代码所在的行号,第一,二行是标题行self.rowNo = noself.fundCodeList = lsdef generateFundDt(self, no, ls):rowValue = table.row_values(no)# 处理每行数据if '' != rowValue[0] or rowValue[0] != '基金代码':# 每行数据,从下标是8开始,以7为步长取数据# print(type(ls))for k in range(8, len(rowValue), 7):if rowValue[k] != '收益率':list_name = namestr(ls, globals())[0]  # 得到参数ls(实际传入的是列表)的名,比如传入dt_002168s 列表,需要得到 'dt_002168s'if str(rowValue[0])[0:-1] in list_name:roi = str(round(float(rowValue[k]) * 100, 3))# str(round(rowValue3[k] * 100, 5))ls.append(roi)print(str(namestr(ls, globals())[0]) + ' ' + str(ls))return ls

P.s 这里面namstr这个函数是得到参数名的一个方法

# 得到某个参数的参数名
def namestr(obj, namespace):return [name for name in namespace if namespace[name] is obj]

3.5 外部调用generateFundDt这个方法

for i in range(0, len(all_funds)):rowValue = table.row_values(i+2)# for j in range(0, countNo):if '' != rowValue[0] and rowValue[0] != '基金代码':gen = FundDataGeneration(i+2, all_funds[i])gen_data = gen.generateFundDt(i+2, all_funds[i])elif rowValue[0] == '' or rowValue[0] == '基金代码':continue

3.6 定义添加y轴数据的函数

def add_yaxis(no):if no > 1:row_values = table.row_values(no)fund_dt_list = all_funds[no-2]print('line.add_yaxis(\'' + row_values[4] + ' 收益率\', ' + namestr(fund_dt_list, globals())[0] + ')')line.add_yaxis(row_values[4], fund_dt_list)

3.7 绘制折线图

# 折线图
line = Line(init_opts=opts.InitOpts(width='1800px', height='1000px'))
line.add_xaxis(dt_dates)
want_2_show_no = 15  # 基金列表里除第一和二行外,其它行数据都是某基金的历史 记录 数据,目前最大行号 X 行(之前清仓的占了大多数)
for i in range(0, want_2_show_no):add_yaxis(i)# 所有折线图显示平均值、最大值、最小值
line.set_series_opts(markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_='average', name='平均值'),opts.MarkPointItem(type_='max', name='最大值'),opts.MarkPointItem(type_='min', name='最小值')])
)# 设置标题等
line.set_global_opts(title_opts=opts.TitleOpts('收益率变化曲线'),# 显示工具箱toolbox_opts=opts.ToolboxOpts(),xaxis_opts=opts.AxisOpts(axislabel_opts={"rotate": 45, "interval": 0}))line.render('收益率 曲线可视化.html')
webbrowser.open('收益率 曲线可视化.html')

4. 调试运行后 效果图,支持柱状图 和 折线图。x轴是记录日期,y是收益率(单位%)。

里面还有其它 功能 没来得及 研究。

总结 

这次算是理论结合实际,学习加实操的一个过程,中途遇到过,PyCharm 断点不能添加(各种搜索,最后却是一个恢复出厂设置搞定的),对debug过程有了新大陆似的发现。好了,就写到这儿吧。

(纯粹闲着找事学习下python,不喜请轻点拍~_~)

更多推荐

使用Python的 xlrd 来读取 基金收益率excel文件

本文发布于:2024-02-27 15:54:35,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1707231.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:收益率   基金   文件   Python   xlrd

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!