AOKI's copy&paste archive

高専から駅弁大学から東工大へ 浅く広い趣味とかキャリアの日記を

交通系のキャッシュフロー.py

Overviews

この間,作った図を極めたいと思ってしまって,別段暇でもないのに,半自動化させるコードを書いた. せっかくなので載せておきたい.

pytho.hatenablog.com

ぶっちゃけこの手の作業は,プロが金にしているんだろうけど. もし就活生の参考になれば幸いだ.

How to run/work

使い方はというと,Edinetという政府の作った有報を電子データでまとめたサイトがあるので,そこからファイルをダウンロードして行う. この作業も自動化したかったが,計算以外のマクロ的なプログラミングはさっぱりなので諦めた.

EDINET

ただこのデータはpdfかxbrlという使い勝手の悪い拡張子なので,同じくEdinetが出しているcsv変換ツールを用いる. ここも手動だ.

利用にはJavaが必要.詳しくは当該ページを見てもらいたい.

実際の図化には下記を参考にした. せっかくなので,一緒に賃借対照表も図化したかったが,該当するパラメータがよくわからなかったのでサボった. 反してキャッシュフローは凡例が自明で助かった. またフォーマットが整っているので,表の同じ位置を参照すれば済むようだ.

入社1年目で知っておきたかった会計の基礎 3:日本経済新聞

図化にあたっては同業種などを任意に選んで比較できるようにしたかった. そのためそうしたデータをまとめた表をlist.xlsxとしている.

横にカテゴリを並べ,縦に企業を並べている. 該当する場合に0としている.

name jr airline
jreast 0
jrcentral 0
jal 0
ana 0

一例としてこんな具合だ.

このリストと各企業の有報csvデータをコードと同じフォルダに入れて実行する. またコードのconfigをラベル名に使ったものに応じて実行される. 下記であればjrとなる. 該当するファイルがない場合はBreakでスキップさせようと思ったが,実力不足で実装できず放置されている.

Script Code

# -*- coding: utf-8 -*-
"""
Created on Sun Oct 25 17:18:08 2020

@author: ataka
"""
import numpy as np
import pandas as pd
import os
import matplotlib.pyplot as plt

#set category
config='jr'
years=[2016,2017,2018,2019,2020]

'''
tab=
[[cate1,cate2,cate3,...],
 [comapny1,0,nan,nan,...],
 [comapny2,nan,0,nan,...],
 [comapny3,0,0,nan,...],...]
'''
tab=pd.read_excel('list.xlsx')
tab=tab[tab[config]==0]

data=pd.DataFrame()

#%%
for company in range(len(tab)):
    file_name=tab.iloc[company,0]+'.csv'
    
    #read comapny yuho csv(.xbrl tranformed) file
    if os.path.exists(file_name):
        paper=pd.read_csv(file_name,'r',delimiter='\t',encoding='utf-16LE')
    else:
        #i will fix...!!!
        break
    
    #written cadhflow data here
    cashflow=paper.iloc[61:76,:]
    cashflow.iloc[:,8] = [int(s) for s in cashflow.iloc[:,8]]
    
    cflist=cashflow.iloc[:,8]
    cflist=list(cflist)
    
    #caliculate net-cashflow by 3params
    for year in range(5):
        operating=cflist[year]
        investing=cflist[year+5]
        financing=cflist[year+10]
        net=operating+investing+financing
        cflist.append(net)
    
    data=data.append([cflist])


#rename df
data=data.set_index(tab['name'])
clm=[]
for typ in ['operating','investing','financing','net']:
    for year in years:
        clm.append(typ+str(year))
data.columns=clm
#yen to million yen
data=data/10**6

#check
print(data)

#%%plt
plt.figure()
barWidth = 1
operating = data.iloc[:,4]
investing = data.iloc[:,9]
financing = data.iloc[:,14]
net = data.iloc[:,19]

plt.bar(list(range(2,len(tab)*4,4)), net, width = 3 * barWidth, color='g', alpha=0.5, label='net')
plt.bar(list(range(1,len(tab)*4,4)), operating, width = barWidth, color='b', alpha=0.5, label='operating')
plt.bar(list(range(2,len(tab)*4,4)), investing, width = barWidth, color='r', alpha=0.5, label='invesnting')
plt.bar(list(range(3,len(tab)*4,4)), financing, width = barWidth, color='y', alpha=0.5, label='financing')

plt.xticks([4 * r + 2 * barWidth for r in range(len(tab))], data.index)
plt.legend()
plt.title(config+' 2020 cashflow')
plt.ylabel('million yen')
plt.show()

#%%stacked bar graph: bad
plt.figure()
operating = data.iloc[:,4]
investing = data.iloc[:,9]
financing = data.iloc[:,14]

bars = np.add(operating, investing).tolist()
r = data.index
barWidth = 1

plt.bar(r, operating, color='b', alpha=0.5, edgecolor='white', width=barWidth)
plt.bar(r, investing, bottom=operating, color='r', alpha=0.5, edgecolor='white', width=barWidth)
plt.bar(r, financing, bottom=bars, color='y', alpha=0.5, edgecolor='white', width=barWidth)
plt.scatter(r, bars+financing, color='g')

plt.title(config+' 2020 cashflow')
plt.ylabel('million yen')
plt.legend(['net','operating','investing','financing'], bbox_to_anchor=(1.05, 0.7), loc='upper left', borderaxespad=0,)
plt.show()

#%%compareing same category comapny by subplot
typs=['operating','investing','financing','net']
plt.figure()
plt.tight_layout()
plt.suptitle(config+' cashflow')
for typ in range(len(typs)):       
    plt.subplot(2,2,typ+1)
    plt.subplots_adjust(wspace=0.75, hspace=0.6)
    for company in range(len(tab)):
        temp = data.iloc[company,typ*5:(typ+1)*5]
        plt.plot(years, temp,label=tab.iloc[company,0])
        #as legend
        plt.text(x=2020,y=data.iloc[company,(typ+1)*5-1],s=tab.iloc[company,0])
    
    plt.title(typs[typ])
    plt.ylabel('million yen')
    plt.xticks(years)
plt.show()

Airline

結果第一号,昨今のコロナ禍で著しく苦境の航空会社.

f:id:pytho:20201031202217p:plain

JAL、自力回復へ綱渡り 赤字最大2700億円 固定費など200億円を追加削減 :日本経済新聞

ANA、最終赤字5100億円 社長「国際線まだ厳しい」 :日本経済新聞

JAL最終赤字2300億円 21年3月期、再上場後初 :日本経済新聞

理想としては半期の決算を図化したいところだが,今回は2019年度の通期のもの. フォーマット次第だが,半期の報告書でもいけそうな気はする. そのファイルを一切見ていないのでアレだが.

f:id:pytho:20201103223633p:plain

f:id:pytho:20201103223647p:plain

f:id:pytho:20201103223700p:plain

コロナ以前のデータでも考察もとい妄想は捗る. JALは2019年までは堅調な推移だった. 投資もほどほどにして,ネットで右肩上がりを保っていた. しかし2020年では営業が悪化し急落した. 1年だけ見ると投資がかさんでしまっている印象を受けてしまうので注意か.

JALは就活で聞いた話でも民事再生の苦い経験から保守的な経営だったようだ. 最近も概ねそうだったようだが,2020年の時点でもコロナが一定程度寄与したか. 国内のコロナの影響は,当該期間では軽微だったが,中国の春節の需要を取り込めなかったのは誤算か. このあたりはANAも同様の課題を抱えていそうだ.

財務の正負の違いの影響が大きそうだ. ANAは先を見越して資金調達して,やり過ごす戦略だったか.

JR

JR西「銀河」学生の"痛烈な一言"が開発の引き金 | 特急・観光列車 | 東洋経済オンライン | 経済ニュースの新基準

f:id:pytho:20201103223535p:plain

f:id:pytho:20201103223550p:plain

f:id:pytho:20201103223607p:plain

航空は2社が拮抗していたが,JRは会社規模の大きさが図から明らかだ. 東と東海は巨大だ.新幹線の総延長の影響か. また東海の派手な額の動きも気がかりだ. リニア関連なのだろうか.

各社とも営業CFは非常に安定している. 航空と比べると定期が年度決済なことと,大需要である年末年始の帰省までは逃げ切れた影響か. となると,今回の半期の下がり幅のインパクトはより大きいだろう.

東は営業が微減する中,投資の拡大もしている点に不安がある. 資金調達を行うものの,合計でマイナスが続いている. 今回のコロナはどん底に突き落とすものであろうから,構造的な改革が必要な印象を与える.

ただやはりいずれも旧国営ということあって,安定的な比率ではある.

Future Work

交通系にしぼって見てみたが,他分野も見てみたい. 土木系ならゼネコンとか,比較的新しい企業にしぼるとかで. あるいは大人気の商社やコンサルの比較も面白そうだ.

半自動化させてあるので,応用は比較的ラクなので.