学习过程中发现分享的基本面函数都没法在python3研究中使用,罪魁祸首是range函数。略作更改就能python2和python3通用了。
def get_fundamentals_sum_mean_value(security='000001.XSHE', search=income.basic_eps, count=5, frequency='quarter'):
'''
输入:
security: 要查询股票的代码
search: 要查询的字段,详情参考 API: get_fundamentals-查询财务数据
count: 单位时间长度,表示返回前几多少期的季报或者年报
frequency: 获取数据类型,'quarter'为季报,'year'为年报
输出:
sum_num: 总值
mean_num: 平均值
df: 一段时间内季报或者年报的 DataFrame
注:
对于年报数据, 我们目前只有 现金流表 和 利润表, 当查询其他表时, 会返回该年份最后一个季报的数据"
'''
import pandas as pd
def get_quarter(month):
if month in (1,2,3):
return 1
elif month in (4,5,6):
return 2
elif month in (7,8,9):
return 3
elif month in (10,11,12):
return 4
# 查询条件
q = query(
income.code,
income.statDate,
search,
).filter(
income.code.in_([security])
)
# 获取最近一次报表发布的日期
statDate_num = get_fundamentals(q)['statDate'][0]
# 获取最近一次报表发布所属的年份
year = datetime.datetime.strptime(statDate_num, "%Y-%m-%d").year
# 获取最近一次报表发布所属的月份
month = datetime.datetime.strptime(statDate_num, "%Y-%m-%d").month
# 获取最近一次报表发布日期所属的季度
qt = get_quarter(month)
# 获取季度列表
qt_list = list(range(qt,0,-1))+list(range(4,0,-1))*(count//4+1)
qt_list = qt_list[:count]
# 查询时间列表
data_list = []
# 获取查询的名称
name = str(search).split('.')[-1]
# 列名称
colums_list = []
# 获取拼接后的 DataFrame
if frequency == 'quarter':
for num in range(len(qt_list)):
s = str(year)+'q'+str(qt_list[num])
data_list.append(s)
colums_list.append(name + '_' + s)
if qt_list[num] == 1:
year -= 1
# 拼接列表
df = get_fundamentals(q, statDate = data_list[0])
df.set_index(df.code.values, inplace=True)
for t in data_list[1:]:
d = get_fundamentals(q, statDate = t)
d.set_index(d.code.values, inplace=True)
df = pd.concat([df[name],d[name]],axis = 1)
elif frequency == 'year':
for num in range(count):
year -= 1
s = str(year)
data_list.append(s)
colums_list.append(name + '_' + s)
# 拼接列表
df = get_fundamentals(q, statDate = data_list[0])
df.set_index(df.code.values, inplace=True)
for t in data_list[1:]:
d = get_fundamentals(q, statDate = t)
d.set_index(d.code.values, inplace=True)
df = pd.concat([df[name],d[name]],axis = 1)
else:
print("请输入正确的 frequency 参数,'quarter'为季报,'year'为年报. \n对于年报数据, 我们目前只有 现金流表 和 利润表, \n\
当查询其他表时, 会返回该年份最后一个季报的数据")
return
# 设置列名称
df.columns = colums_list[:len(df.iloc[0])]
# 计算总值
sum_num = sum(df.iloc[0])
# 计算平均值
mean_num = mean(df.iloc[0])
# 返回结果
return sum_num, mean_num, df
sum_num, mean_num, df = get_fundamentals_sum_mean_value()
sum_num
mean_num
df
sum_num
mean_num