見出し画像

TSMCの月次売上を確認する。

無料で読めます。
株関連の情報をチェックしながらPythonスキルも上げるのだ!

TSMCのホームページで毎月公開されているEXCELの売上データから

画像15

煩わしいEXCELの操作なしで下記のTSMCの売上のグラフを作成します。

画像1

Pythonのプログラムスキル的にできる事は下記の通り。

Pythonのプログラムスキル的にできる事。
 ・EXCELファイルのデータをグラフ化
 ・Web上の情報を直接グラフ化(PC内のデータでもOK)
 ・シートを指定してグラフ化
 ・不要なヘッダー、フッターを除外してグラフ化
 ・フォーマットを整形してグラフ化

株関連として取得できる情報は下記の通り。

株関連として取得できる情報。
 ・TSMCの売上の推移をチェック
 ・TSMCの売上のYoY、MoMの増減をチェック
 ・TSMCの売上の更新日付をチェック

0.事前準備

事前準備はこちら。5分もあればできると思います。

1.ソース

ソースは下記の通り。

詳しい解説は最後に書きます。

import datetime as dt
import requests
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

# 処理で使う前月を変数に格納
now = dt.date.today()- dt.timedelta(days=30)

# 対象データファイルのURL(前月の変数を使用)
url = ("https://investor.tsmc.com/english/encrypt/files/encrypt_file/mr/Historical_Monthly_Revenue_"
+"{0:%B}".format(now) +".xlsx")

# EXCELデータをデータフレームに格納(シート名、ヘッダー、フッターを指定)
df = pd.read_excel(url, sheet_name="Consolidated", header=6, skipfooter=1)

# グラフ化で不要な年単位の集計項目を削除
df=df.drop("Total",axis=1)

# 項目を日付型に変更してインデックスに設定
df["Net Revenue"]=pd.to_datetime(df["Net Revenue"],format='%Y')
df = df.set_index('Net Revenue')

# データを格納するデータフレームを準備
df2=pd.DataFrame({'Date': [],'Revenue': []})

# データの並びを、時系列で縦方向に整形(前月の変数を使用)
for i in range(2006,int("{0:%Y}".format(now))+1):
 for j in range(0,12):
   df2=df2.append({'Date': str(i)+"-"+str(j+1), 'Revenue': df[str(i)].iloc[0,j]}, ignore_index=True)

# 空データの削除
df2=df2.dropna()

# 項目を日付型に変更してインデックスに設定
df2["Date"]=pd.to_datetime(df2["Date"],format='%Y-%m')
df2 = df2.set_index('Date')

# YoYを取得
df3=df2.pct_change(12)
# MoMを取得
df4=df2.pct_change()

# YoYのグラフを作成。(全期間、2年間)
df2.plot.bar(figsize=(8,4),fontsize=3, title="TSMC Revenue")
df2.iloc[-24:,:].plot.bar(figsize=(8,4), title="TSMC Revenue ( 2 years)")

# YoYのグラフを作成。(全期間、2年間)
df3.plot.bar(figsize=(8,4),fontsize=3, title="TSMC Revenue YoY")
df3.iloc[-24:,:].plot.bar(figsize=(8,4), title="TSMC Revenue YoY ( 2 years)")

# 前々月のYoY,MoMを出力
print("\n------"+dt.datetime.strftime(df3.index[-2], '%B')+"------")
print("YoY: "+ str(round(df3.iloc[-2,0]*100,2)) +" %")
print("MoM: "+ str(round(df4.iloc[-2,0]*100,2)) +" %")

# 前月のYoY,MoMを出力
print("\n------"+dt.datetime.strftime(df3.index[-1], '%B')+"------")
print("YoY: "+ str(round(df3.iloc[-1,0]*100,2)) +" %")
print("MoM: "+ str(round(df4.iloc[-1,0]*100,2)) +" %")

# 更新日を確認
res = requests.head(url)
print("\n------ Last-Modified ------")
print(res.headers["Last-Modified"]+"\n")

plt.rcParams['axes.grid'] = False
plt.show()

# ここまで

2.実行結果

売上の推移(2006~2021/05)は下記の通り。

画像2

直近2年間を抜き出すと下記の通り。
(注:日付は便宜上、1日になっているが月末までの売上を示す。)

画像3

前年比(YoY)の売上は下記の通り。

画像4

直近2年間の前年比(YoY)の売上は下記の通り。

画像5

4月、5月の売上をYoYとMoMの数字でみると、下記の通り。

画像6

更新日付は2021年6月10日の14時となっている。
(注意:GMT 05時に9時間足すと、14時)

毎月、これぐらいのタイミングで確認すると良さそうである。

3.ソース解説

では、ソースについて説明していこう。

# 処理で使う前月を変数に格納
now = dt.date.today()- dt.timedelta(days=30)

# 対象データファイルのURL(前月の変数を使用)
url = ("https://investor.tsmc.com/english/encrypt/files/encrypt_file/mr/Historical_Monthly_Revenue_"
+"{0:%b}".format(now) +".xlsx")

最初の行では、後の処理で使う前月(30日前)を変数に格納

次の行では、ファイルが格納されているパスを指定。
このファイルパスは、下記の赤枠のURLを示す。

画像7

出典:TSMCのIRより(URL

このURLには、下記のように「May」という毎月の変更が予想される文字列が使われている。

「https://investor.tsmc.com/english/encrypt/files/encrypt_file/mr/Historical_Monthly_Revenue_May.xlsx」

この変更に対応するために、先ほど変数に格納した前月の情報を使用している。「"{0:%b}".format(now)」で30日前の日付から、月の情報を「%b」で取得している。

ちなみに、「B」を大・小文字に変える事で、短縮名と切り替えることができる。現状は、「May」を短縮名と想定してコーディングしているが、短縮名でない場合は、ココを大文字に変える必要がある。

%B:January
%b:Jan

仮に、規則性の無いファイル名でアップされてエラーになった場合は、上記のIRページからURLを調べ、該当箇所にURLを貼り付けて実行して欲しい

次にEXCELデータをデータフレーム(2次元の表形式データ)に格納。

# EXCELデータをデータフレームに格納(シート名、ヘッダー、フッターを指定)
df = pd.read_excel(url, sheet_name="Consolidated", header=6, skipfooter=1)

この処理では、対象ファイルパス(URL)、シート名、ヘッダー、フッターを指定して取り込むデータの場所を特定

というのも、対象のEXCELを開くと下記の様になっている。

画像8

出典:TSMC IR

データは「Consolidated」とシートに入っており、
7行目(0スタートで6行目)がヘッダーで、
26行目(後ろから1行目)がフッターになっている。

その為、対象を絞り込むために、下記のパラメータを設定している。

「sheet_name="Consolidated", header=6, skipfooter=1

ここで、鋭い人は気付いたかもしれないが、一見キレイに格納されているように見えるデータだが、グラフ化するには2点問題がある。

画像9

1、最後にTotalの列があり、グラフ化で邪魔になる。
2、年ごとに区切られ、連続するデータになっていない。
(赤の矢印のように行を跨いでデータが連続。)

そこで、データの整形を行っていく。

# グラフ化で不要な年単位の集計項目を削除
df=df.drop("Total",axis=1)

# 項目を日付型に変更してインデックスに設定
df["Net Revenue"]=pd.to_datetime(df["Net Revenue"],format='%Y')
df = df.set_index('Net Revenue')

まず最初にTotalのカラムを削除。
次に、データを並び替えやすくするために、
「年」が入っているカラムを日付型に変更して、インデックスに設定
この様にしておくと、データが取り出しやすくなるのだ。

例えば、下図のようにデータが格納されている場合、

画像11

df2["2010"]と指定することで、
下図、左側のように、年を絞ってデータを抽出ができる。

画像11

更に、上図の右側のように、合計値、平均値、 中央値を求める事もできる。
これを使うと、年単位、月単位の集計操作が容易になるので、知っておくと何かと役に立つだろう。

# データを格納するデータフレームを準備
df2=pd.DataFrame({'Date': [],'Revenue': []})

# データの並びを、時系列で縦方向に整形(前月の変数を使用)
for i in range(2006,int("{0:%Y}".format(now))+1):
for j in range(0,12):
  df2=df2.append({'Date': str(i)+"-"+str(j+1), 'Revenue': df[str(i)].iloc[0,j]}, 
  ignore_index=True)

次に、整形したデータを格納する空のデータフレームを準備し、2重のfor文を使って年ごと繰り返し処理の中で、月ごとの繰り返し処理を行い一つづつデータを取り出して、データフレームに追記している。

イメージ的には、先ほどの図の矢印の向きに従ってデータを抜き出して、

画像12

それを、下記の様にデータを時系列に縦に格納する処理を行っている。

画像13

for文の繰り返し処理では、範囲をrangeで指定する。

rangeで指定した1つ目の数字から、2つめの数字の「前」まで、繰り返し処理が行われる。

そのため、年を抽出する処理では2006から、コーディングの最初で取得した前月日付から「年」を抜き出して「1」を加算している。

また、月を抽出する処理では、0番目から12番目の手前までの12個の列を抜き出すようにrangeを0から12と設定している。

for i in range(2006,int("{0:%Y}".format(now))+1):
for j in range(0,12):

ややこしい処理は、この辺りだけで、あとは簡単な処理である。

下記では、今年の6月以降のデータは、まだ空なので、空データを削除

# 空データの削除
df2=df2.dropna()

下記では、それぞれ、前年比のYoYを出すために、12コ前のデータからの変動率を算出し、前月比のMoMを出すために、1つ前のデータからの変動率を算出。

# YoYを取得
df3=df2.pct_change(12)

# MoMを取得
df4=df2.pct_change()

下記では、項目を日付型に変更してインデックスに設定

# 項目を日付型に変更してインデックスに設定
df2["Date"]=pd.to_datetime(df2["Date"],format='%Y-%m')
df2 = df2.set_index('Date')か

下記では、売上のグラフを「全期間」と「2年間」で二つ作成。
直近の2年間のデータを抜き出すために、iloc[-24:,:]
行に対して「-24:」で24個前から最後までの行を指定し、
列に対して「:」で全ての列を指定。
(注意「:」はすべてを表し、カンマの前が行に対しての指定で、カンマの後ろが列に対しての指定。)

# グラフを作成。(全期間、2年間)
df2.plot.bar(figsize=(8,4),fontsize=3, title="TSMC Revenue")
df2.iloc[-24:,:].plot.bar(figsize=(8,4), title="TSMC Revenue ( 2 years)")

次に、下記では、前段で処理で取得したYoYを格納したデータフレームを使い、YoYの売上のグラフを「全期間」と「2年間」で二つ作成。

# YoYのグラフを作成。(全期間、2年間)
df3.plot.bar(figsize=(8,4),fontsize=3, title="TSMC Revenue YoY")
df3.iloc[-24:,:].plot.bar(figsize=(8,4), title="TSMC Revenue YoY ( 2 years)")

下記では、YoYとMoMの数字を100倍して%で出力。
処理としては「\n」で改行を入れたり、
round(x,2)で下二桁までの数字にしたり、
str(x)で文字列に変換して、文字が結合できるようにしている。
前月を示す「月」の情報は、「df3.index[-1]」で最後から1行目のデータから取得し、同様に、前々月を示す「月」の情報は、「df3.index[-2]」で最後から2行目のデータから取得している。

# 前々月のYoY,MoMを出力
print("\n------"+dt.datetime.strftime(df3.index[-2], '%B')+"------")
print("YoY: "+ str(round(df3.iloc[-2,0]*100,2)) +" %")
print("MoM: "+ str(round(df4.iloc[-2,0]*100,2)) +" %")

# 前月のYoY,MoMを出力
print("\n------"+dt.datetime.strftime(df3.index[-1], '%B')+"------")
print("YoY: "+ str(round(df3.iloc[-1,0]*100,2)) +" %")
print("MoM: "+ str(round(df4.iloc[-1,0]*100,2)) +" %")

処理は、出力結果の下記に該当。

画像14

最後に、下記のコードで、ファイルの更新日を出力。

# 更新日を確認
res = requests.head(url)
print("\n------ Last-Modified ------")
print(res.headers["Last-Modified"]+"\n")

古いファイルを見ていないか、念のため、更新日を取得し、ファイルの更新を確認できるようしている。

以上、コーディングについて説明してみました。

「TSMCの業績確認」Pythonコーディング」の参考になれば幸いです。

では!

おつかれさん「缶コーヒー1杯ぐらい、ご馳走してあげよう」という太っ腹な方がいれば、よろしくお願いします!
課金しなくても、参考になったら、「ハートボタン」をクリックしたり、「フォロー」したり、「リツイート」してくれると読まれる可能性があがるので嬉しいです。次の記事を書くやる気が出ます。よろしくお願いします!

ここから先は

40字

¥ 100

この記事が気に入ったらサポートをしてみませんか?