#Python# #Wind#
使用我【上市公司财务报表分析工具】的小伙伴都知道,我个人是非常喜欢河流图的,因为河流图比较直观地展示了数据的激变点。
同样地,我们可以将漂流图用于追踪上市公司主营业务的变化情况。
上图是晨光文具的主营业务变迁图,从图中我们可以看出,2019年以前,上市公司主要业务为书写工具的生产与销售,2019年年报中进行了细节阐述。细化成办公直销、办公文具、学生文具等。通过变迁图我们可以一窥上市公司经营战略的变化(如:如果上市公司主营业务经常变化,说明上市公司经营战略不稳定,喜欢追逐热点等等),但目前免费提供的数据基本上是这样的。
或者这样的
虽然也挺有用,但未免不够直观。
近期帮小伙伴做过一个Wind的模板,就使用了河流图,但Wind给的原始数据基本上和上面提供的表格差不多,因此小编写了一段代码对获取的数据进行格式化为下图所示的数据表,从而可以进行河流图的绘制。
代码及重要注释如下:
def value_count(list,value): #统计value在list中出现的次数
count = 0
for i in list:
if i == value: count = count 1
return count
def business_seg(code):
current_date=datetime.strftime(datetime.now(),"%Y-%m-%d")
mrq = w.wss(code, "latelyrd_bt","tradeDate={}".format(current_date)).Data[0][0] #获取最新报告期
lyr = '2019-12-31' #最新年报初始值,后面会根据获取到的mrq值更新
if mrq.month == 12 :
lyr = mrq.strftime("%Y-%m-%d")
else:
lyr = str(mrq.year - 1) '-12-31'
order=1 #获取数据指针,为1则代表最新年度,为2则代表前一年度,为3则向前推2年
loop=True
times = []
products=set()
names,revenues=[],[]
data_t = w.wsd(code, "segment_product_item,segment_product_sales1", "ED-10Y", lyr, "order={};unit=1;currencyType=;Period=Y;Days=Alldays;ShowBlank=-".format(order)) #按照产品获取数据报表,不过获取的报表数据是零散的,以下代码将其格式化为上图所示的样式;另外:该代码不用死记硬背,使用Wind金融终端的代码生成器可以轻松生成出来,稍微修改就可用了。
times = [datetime.strftime(_, "%Y-%m-%d") for _ in data_t.Times]
names.append(data_t.Data[0])
revenues.append(data_t.Data[1])
order = 2
while loop==True:
data_t = w.wsd(code, "segment_product_item,segment_product_sales1", "ED-10Y", lyr, "order={};unit=1;currencyType=;Period=Y;Days=Alldays;Showblank=-".format(order))
if value_count(data_t.Data[0],'-') == len(data_t.Data[0]) or order > 5:
loop=False
break
names.append(data_t.Data[0])
revenues.append(data_t.Data[1])
products = products.union(data_t.Data[0])
order = order 1
#print(names,revenues,products)
df = DataFrame(columns=times,index=products) #生成空表,行标为产品名称,列标为报告期
#查表及填表
for i in range(len(names)):
for j in range(len(names[i])):
df.loc[names[i][j],times[j]] = revenues[i][j]
df=df.dropna(how='all').dropna(axis=1,how='all')
df=df.loc[(df.sum(axis=1) != 0), (df.sum(axis=0) != 0)] #删除空行
df = df.sort_index(axis=1,ascending=False)
df = df.sort_values(by=lyr,ascending=False)
sio = StringIO()
df.to_csv(sio)
sio.seek(0)
return sio.read()
将相应表格推送给Excel,就可以在Excel中绘制河流图了。后面我们再聊聊如何将数据推送到Excel上。
,