エクセルファイルをpandasで利用してまたエクセルに戻すには

財務においてデータはエクセルを利用することが一般的かと思います。

そのデータを分析するには、pandasを利用すると楽になります。
それには次の手順が基本となります。

1. エクセルファイルをpandasで読み込む
2.pandasで表を加工、分析する
3.pandasで出来上がった表、データをエクセルに戻す(書き込む)

次の表のうち、科目名称(B列)、通貨コード(D列)、円換算額(F列)の列のみを抽出して別シートに「外貨換算_2」の名前で書き込んでいきます。

では、コードを書いていきます。

import os
os.chdir(“C:/Users/ユーザー名/Documents/Python”)

import openpyxl
import pandas as pd

fx_sheet=pd.read_excel(“./RPA/RPA_エクスポージャー分析.xlsx”,sheet_name=”外貨換算”) # ①

fx_sheet_2=fx_sheet[[“科目名称”,”通貨コード”,”円換算額”]] # ②

file_name = “./RPA/RPA_エクスポージャー分析.xlsx” # ③

with pd.ExcelWriter(file_name,engine=”openpyxl”, mode=”a”) as ew:
fx_sheet_2.to_excel(ew, sheet_name=”円換算額_2″) # ④

①エクセルファイルをpandasで読み込みます。

② pandasで読み込んだデータを加工します。ここでは、表示したい科目を選んでいます。

③  エクセルのファイル名を変数へ代入しておきます。(④で使います)

④ pandasので加工したデータをエクセルシートに書き出します。
sheet_name= “円換算額_2” と書き出すシート名を指定します。

次のように、新しいシートに指定した名前でデータが書き込まれます。

エクセル → pandas → エクセル の手順でした。

表の最終列を読み取る

 

次の表のE列に日付を書き込みたいと思います。

表の最終列(D列)を取得して、書き込み列を指定します。

表の最終列を取得する場合、表より離れた場所に入力や書式設定がされているとその場所を最終列とみなしてしまいます。
そこで、表の最終列(ここではD列)を確実に最終の列と判断するために次の関数を利用します。

def remove_right_none(lst): # 関数名
    count = len(lst) # ① 
    for item in reversed(lst): # ②
        if item.value is None: # ③
            count = count – 1 # ③
        else:   # ④
            break # ④
    return count # ④

① 引数に指定されたlstの長さをカウントする
② 最後のセルからひとつづつitem変数に入る
③ そのセルが空白ならばカウントを1つ減らず
④ セルが空白でなければ処理は終了して、その時点のセルの数を返す(それが空白列を除いた最大列となる)

 

それでは、E2へ日付を書き込んでいきます。

# ワークシートを変数へ代入します。
wb = openpyxl.load_workbook(“./RPA/RPA_月次決算.xlsx”)
ws_3 = wb[“損益計算書(累計)”]

# 「損益計算書(累計)」シートの最大列を取得します。
data_column_num_3 = max([remove_right_none(row) for row in ws_3.rows])

このコードの意味を説明すると次のようになります。

①決算書シートの行から1行づつ取り出しrow変数へ代入します。
② そのrow(1行分)が関数の引数となりremove_right_none(lst)関数で処理され列数が返ります。
③ すべての行につき関数で処理された後、1番大きい列数が最大列としてdata_column_num_3へ代入されます。

行ごとに最終列がことなる可能性があるため、すべての行につき最終列を取得した後に、その中でも一番大きな列番号をmax( ) で取得して表の最終列とします。

# 書き込む列番号を取得します。
cl_col_3 = data_column_num_3 + 1

# 日付を書き込む
ws_3.cell(row=2, column=cl_col_3).value = “2020/05/31″

 

以上で、損益計算書(累計)シートのE2へ ”2020/05/31″ と書き込まれました。

1行すべてが空白の行を判定する

エクセルシートに合計残高試算表があります。
このデータを読み込んでリストにしたいと思います。

合計残高試算表の最終行は次のようになっています。

データは238行目で終了しており、242行目は貸借が一致するか確認の計算式が入力されています。

表から離れた場所にデータや書式設定があるとそこまで行を読み込んでしまいます。

よって、行のすべてが空白(239行目)の場合にはその前の行(ここでは238行)が表の最終行とするようにしたいときこの関数を利用します。

次のようにis_empty( )の名前で関数を作成します。

def is_empty(cell):
return cell.value is None or not str(cell.value).strip()

これは、セルに値がない場合はTrueを返します。
また、セルに半角スペースがある場合、空とみなされなため、スペースをstrip()で除いた後、strではない(つまり空)ときTrueを返します。

社会保険料の徴収額について

社会保険料について、どれくらい給与から徴収されているのかまとめてみました。(2020年度)

医療保険は会社員が加入する組合健保(主に大企業)、公務員の共済組合、 中小企業の社員が入る全国健康保険協会(協会けんぽ)、そして自営業者らの国民健康保険に大きく分かれます。

このうち、主に中小企業が属する「協会けんぽ」について述べてみます。

保険料の決まり方

保険料は個人の給与額(通勤費・残業手当含む)および賞与額を基に算出されます。

給与は、標準報酬月額という基準を50段階(厚生年金保険は30段階)に設定して、そのどれかにあてはめることで、保険料の計算をやりやすくしています。

4・5・6月の3カ月の給与の平均をとって、標準報酬月額を毎年改定します。

賞与は、支給された賞与額に保険乗率(給与と同じ)を乗じて算出されます。

標準報酬月額(または賞与額)×保険乗率で求められた金額を、個人と会社(法定福利費)が折半で負担します。

実務的には、それぞれの社員の給与額を次の保険料算定表で照らし合わせて算定します。

 

 

2020年度の保険料 (東京都)

健康保険料
標準報酬月額 × 9.87%   → 会社と個人が折半(4.935%)
地域ごとに異なります。 全国健保保険協会(協会けんぽ)

厚生年金保険料
標準報酬月額   ×  18.3%    → 会社と個人が折半(9.15%)
2017年9月を最後に引上げが終了し、厚生年金保険料率は18.3%で固定。

介護保険料
標準報酬月額 ×   1.79% → 会社と個人が折半(0.895%)

以上より、保険料総額は報酬の29.96%となり、これを個人と会社が折半して負担します。

よって、個人の給与(または賞与)から14.98%が保険料として徴収されることになります。

                      

1.保険料の見通しについて

今後の保険料値上がりの見通し

まず、過去10年間の保険料の推移についてまとめてみました。

①. 健康保険料について

健康保険料は地域によって異なり、それぞれの地域にて自主的に決定されます。
(東京都の場合は10年前と比較して増加はしておりません。)

これがどのように上昇もしくは下降するのか、というものに関し指針等はなく、自主的に組合会で決定するとのことです。

②.厚生年金保険について

厚生年金保険料は、段階的に引き上げられ2017年度に18.3%となり打ち止めとなっています。

ただ、厚生年金の標準報酬等級が1つ加えられ、現在620千円である最高等級の上にもう1つ等級ができるという情報があります。

③. 介護保険料について

介護保険料は第2号被保険者(40歳以上64歳まで)が支払います。

介護保険料は、2017年度以前は、それぞれの組合の加入者の割合に応じて、それぞれの負担額が決められていましたが、2017年度よりそれぞれの組合の総報酬額の割合に応じて決められることになりました。

まず各健保、各共済、協会けんぽの第2号被保険者の年間の給与などの報酬(標準報酬月額)と賞与(標準賞与額)の合計額 (総報酬額)を算出します。

その総報酬の割合に応じて、保険料を割り振っていきます。

総報酬割の導入は2017年度8月から始まり、2017年度は総額の3分の1、2018年度は2分の1、2019年度は4分の3が総報酬割となり、2020年度で全面導入されました。

これにより、相対的に報酬の高い大企業が加入する健保組合の負担額が増加し、中小企業が加入する協会けんぽの負担額が減少することになります。

2020年度はこれまで段階的に導入されてきた総報酬割が全面導入される年であるため、大企業の健保組合では得に負担額が増加することとなります。

協会けんぽの2020年度の保険率は1.79%に決まりました。(前年1.73%)

今後要介護が増額していけば、その負担率も上昇していくことになります。

これまでどれくらいのペースで介護保険料が上昇してきたのかを調べてみます。

介護保険料をプロットし、近似曲線を描いてを見てみると、
y=0.0003x+0.0147となっており、毎年0.03%づつ上昇していることがわかります。
これでいくと、2020年度は1.74%が推定値でしたが実際は1.79%と0.05%高い率となっています。

今後はこれくらいの上昇率で上昇していくのか心配なところです。

保険料値上げについてのまとめ

健康保険料:
地域ごとに決定されるが、東京都の場合これまでのところ上昇するという指針は出ていない。

厚生年金保険料:
2017年度まで段階的に引き上げてきたが、18.3%で打ち止め。今後は法改正がない限り上昇はない。(はず・・)

介護保険料:
毎年0.03%づつ上昇しており、今後要介護が増えてくるため引き続き上昇の可能性が大きい。(毎年0.03%~0.05%位づつ上昇か?)

介護保険料の増加において、現在ニュース等で話題となっています。

介護保険料は、2017年度以前は、それぞれの組合の加入者の割合に応じて、それぞれの負担額が決められていましたが、2017年度よりそれぞれの組合の総報酬額の割合に応じて決められることになりました。

理由は、

大企業が属する組合健保と中小企業が属する協会けんぽでは、加入者は協会けんぽの方が多いため、保険料の負担額は協会けんぽの方が多くなっていました。

しかし、報酬額で比較すると大企業が属する組合健保の方が大きいため、報酬に対する保険料の比率が協会けんぽでは不利になっていました。

そのため、その不公平感をなくすため、介護医療費の負担方法を加入者割から総報酬割に変更することになりました。

2017年度より加入者割から総報酬割に変更になり、これまで段階的に移行する経過措置が取られてきましたが、2020年度に経過措置が解除され満額が総報酬割となります。

よって、相対的に報酬額の高い大企業が加入する組合健保では、介護保険料が高くなる傾向があります。

協会けんぽは、中小企業が所属しているため相対的に報酬額が低く、介護保険料の増加もそれほど大きくありません。(1.73%から1.79%へ0.06%上昇)

とはいえ、今後要介護が増えてくるため、介護医療費の総額が上昇すればその負担額も大きくなってきます。

スポンサーリンク

表の最大列を取得する関数を作成する

毎月の試算表が列ごとに記されており、新しい月の試算表は表の最大(右)列のひとつ右の列に書き込まれていきます。

では表の最大列はどのように取得したらよいのでしょうか?

通常はmax_columnで取得できますが、表からはずれて右側に文字または書式が設定されている場合、その列を最大列と認識してしまいます。

すると書き込みはその右側の列に書き込まれてしまいます。

上の図では、表の最後は先月(4月)の書き込みがされているD列なので、当月(5月)分としてはE列に書き込みたいところです。
しかし、G4にグレー色の書式が設定されているため、G列を表の最後の列と認識してしまい、その右の列、つまりH列に5月分が書き込まれてしまっています。

表からはずれて文字入力や書式が設定されていても、表の最終列を認識するためそれに対応する関数を作成することにします。

最大列を取得する関数を作る

書式が設定されていてもデータがなければ空列とみなすように作成します。

def remove_right_none(lst): # 関数名
    count = len(lst) # ①
    for item in reversed(lst): # ②
        if item.value is None: # ③
            count = count – 1 # ③
        else:   # ④
            break # ④
    return count # ④

① 引数に指定されたlstの長さをカウントする
② 最後のセルからひとつづつitem変数に入る
③ そのセルが空白ならばカウントを1つ減らず
④ セルが空白でなければ処理は終了して、その時点のセルの数を返す(それが空白列を除いた最大列となる)

 

 

最大列を取得する関数ができたところで、さっそく使用してみます。

作成した remove_right_none( ) 関数を次のように利用します。

# ワークシートの取得
ws_2 = wb[“合計残高試算表_2”]

# 各行の最大列うち、最も大きい列を取得
data_column_num_2 = max([remove_right_none(row) for row in ws_2.rows])  

1.シートの行から1行づつ取り出しrow変数へ代入する。
2.そのrow(1行分)が関数の引数となりremove_right_none( )関数で処理され列数が返る。
3.すべての行につき関数で処理された後、max( )によりその中から1番大きい列数が最大列としてdata_column_num_2へ代入される。

これで表の最大列(上記図のD列)が取得されました。

 

 

集合関数を利用して事業区分を整える

子会社を吸収した関係で事業区分の再編を行っています。

親会社の事業区分は次の通りです。
事業区分   チーム区分
・事業C  ・チーム1
・事業C  ・チーム2
・事業D
・事業E

子会社の事業区分は次の通りです。
事業区分   チーム区分
・事業A  ・チーム1
・事業A  ・チーム2
・事業C  ・チーム1
・事業C  ・チーム2
・事業D
・事業G

親会社と子会社が合併した関係で事業区分につき整理したいと思います。
次の①、②、③の目的で整理してみます。

①和集合
親会社と子会社の事業区分をまとめます。
親会社と子会社では、同じ事業を行っていたものもあり、またC事業のようにチームは分かれますが同じ事業というものもありますので、事業区分がダブることなく親会社と子会社を合わせてどんな事業があるのかを把握します。

②積集合
親会社と子会社で同じ事業は何があるのかを整理します。

③差集合
子会社の行っていた事業のうち、親会社で行っていない事業は何があるのかを整理します。

それぞれの事業区分を抽出したら次のようなデータができました。
親会社(parent)=C ,E, D, C
子会社(sub)=G, D, C, C, A, A

アルファベット順になっていないため見にくいですが、気にすることなく次のコードを書いて整理します。
(pythonのnumpyモジュールを使用します)

import numpy as np

parent = [‘C’, ‘E’,’D’,’C’]
sub = [‘G’,’D’,’C’,’C’, ‘A’,’A’]

# ① 親会社(paretnt)と子会社(sub)の和集合を出力
print(np.union1d(parent,sub))

# ② 親会社(paretnt)と子会社(sub)の積集合を出力
print(np.intersect1d(parent, sub))

# ③子会社(sub)から親会社(parent)を引いた差集合を出力
print(np.setdiff1d(sub, parent))

すると次のように出力されました。

['A' 'C' 'D' 'E' 'G']
['C' 'D']
['A' 'G']



結果は次の通りとなります。

① 親会社と子会社の事業をまとめる(和集合)
[‘A’ ‘C’ ‘D’ ‘E’ ‘G’]

抽出したデータはアルファベット順になっていませんでしたが、結果はアルファベット順に返りました。
また、チームが複数あるC事業はひとつにまとめられています。

②親会社が行う事業と子会社が行う事業で同じもの(積集合)
[‘C’ ‘D’]

③子会社が行う事業で親会社が行っていなかった事業(差集合)
[‘A’ ‘G’]

以上統合における事業整理でした。

利益の増減要因を分析する

事業報告をします。

前年のH事業における売上総利益は次の通りでした。
おしまい・・

これでは社長からお叱りを受けるのは目に見えていますね。

利益は商品別に前年と比較してどうだったのか?
商品別に数量の変動はどれくらいあったのか?単価変動は?
数量の変動が利益の増減に寄与した分はどれくらいか?単価変動が利益に影響した額はどれくらいか?

せめてこれくらいは答えなければなりません。

では情報を整理して報告書を作成してみましょう。

H事業の商品別の粗利益は次の通りでした。

表1

また商品ごとの数量と単価情報を追加します。

表2

これで情報は整いました。

では、2020年度の利益と2019年度の利益の増減額において、
数量が影響した額と、単価が影響した額をそれぞれ算出してみましょう。

ここでもうひとつ用意しておく情報として、商品別の利益単価が必要となります。

利益=(販売単価-仕入単価)×数量

ですので、先の単価表から①販売単価-②仕入単価、つまり利益単価の金額を算出しておきます。

表3

商品Aの利益増減要因分析

では商品Aについてみていきましょう。

商品Aの利益は2019年度は30,900,000円、2020年度は20,000,000円でした。
(表1より)

10,900,000円のマイナスです。。

数量は2019年度が103,000 (kg), 2020年度が50,000 (kg)ですので53,000 (kg)減少しました。(表2より)

利益単価は2019年度が300円、2020年度が400円と100円増加しました。
(表3より)

ここで次の図を描いてみましょう。

赤の□の面積が当期(2020年度)の利益額となります。
当期数量(50,000kg)×当期単価(400円)=20,000,000円

青の□の面積が前期(2019年度)の利益額となります。
前期数量(103,000kg) ×前期単価(300円)=30,900,000円

数量減少による面積(利益)の減少額と単価の増加による面積(利益)の増加額の合計が、利益の増減額となります。

計算してみると次のようになります。

数量減少による面積(利益)の減少額は
(当期数量:50,000kg-前期数量:103,000kg ) ×前期単価:300円=▲15,900,000円・・①

利益単価増加による面積(利益)の増加額は
(当期単価:400円-前期単価:300円)×当期数量:50,000kg=5,000,000円・・②

利益の増減額は
①+②=▲10,900,000円となり、表1の金額と一致していることがわかります。

商品Bの利益増減要因分析

では商品Bについてもみていきましょう。

商品Bの利益は2019年度は5,600,000円、2020年度は14,700,000円でした。
(表1より)

9,100,000円と大幅に増加しています。

数量は2019年度が70,000 (kg), 2020年度が147,000 (kg)ですので77,000 (kg)増加しました。(表2より)

利益単価は2019年度が80円、2020年度が100円と20円増加しました。
(表3より)

ここで次の図を描いてみましょう。

 

赤の□の面積が当期(2020年度)の利益額となります。
当期数量(147,000kg)×当期単価(100円)=14,700,000円

青の□の面積が前期(2019年度)の利益額となります。
前期数量(70,000kg) ×前期単価(80円)=5,600,000円

数量増加による面積(利益)の増加額と単価の増加による面積(利益)の増加額の合計が、利益の増減額となります。

 

計算してみると次のようになります。

 

数量増加による面積(利益)の増加額は
(当期数量:147,000kg-前期数量:70,000kg ) ×前期単価:80円=6,160,000円・・①

利益単価増加による面積(利益)の増加額は
(当期単価:100円-前期単価:80円)×当期数量:147,000kg=2,940,000円・・②

利益の増減額は
①+②=9,100,000円となり、表1の金額と一致していることがわかります。

 

通常は、単価を下げて数量を多く販売するか、数量が下がるのを覚悟で単価を上げるかの選択になり、単価と数量は反比例の関係にあるかと思います。

単価も数量も増加した商品はどんな理由があるのかさらに分析が必要です。

商品Cと商品Dの利益増減要因分析

商品Cと商品Dについても分析図を示しておきますので確認してみて下さい。

商品C

商品D

粗利益の増減はなくても、分解してみると数量の増減と単価の増減がありますのでそれぞれの増減要因を確認しておく必要があります。

借入金総額は多いのか?妥当なのか検証する

会社は事業を運営するうえで資金が必要であり、銀行などから資金調達をします。

銀行は、その会社の信用度により貸し付ける資金の総額を決めます。
財務の担当者としては、銀行から見てどれくらいが貸付ける金額として妥当なのかを知りたいところです。

一番のポイントはなんといっても事業の評価であることは間違いありません。
現在赤字で大きな借金があったとしても、今後莫大な利益が見込まれるのであればいくらでも資金調達することは可能です。(その将来性を評価してもらえるのであればですが)

ここではそのような収益性を除き、バランスシートにおいて借入金の限度はどれくらいなのかを判断してみます。

銀行より短期と長期を合わせて43億円を借り入れています。
この額は大きすぎるのか、妥当なのか?

次のバランスシートにより検証してみます。

                              単位:千円

運転資本
運転資本からみた借入金総額の妥当性検証

事業を運営するために、いくらの資金が必要なのかを考えます。
事業運営をするために必要な資金は運転資金として算出します。

運転資金は通常、売上債権、棚卸資産、買掛債務により求めますが、手元資金がゼロでは事業運営ができませんので、現金および預金も事業運営に必要な資金として含めて計算します。

上記のバランスシートにより運転資金は、4,451,900千円となります。
現預金(C3)+売掛債権(C4)+棚卸資産(C5)-買掛債務(F3)
=4,451,900千円

よって、事業を運営するにあたり44億円が必要であり、その分の借入金が必要となります。

運転資金の各項目と借入金の関係は次の通りです。

現預金
事業を運営するにあたり現金および預金は必要であり、その分借入が必要となる。

売掛債権
販売をしたけどまだ現金を回収していないため、資金が不足する状態であり、その分借入が必要となる。

棚卸資産
購入したがまだ売上になっていないものであり、購入した分資金が不足している状態であり、借入が必要となる。

買掛債務
仕入をしたけど支払いを待ってもらっているため、資金に余裕がある状態であり、その分借入は必要ない。

一方、当社の借入金は次の通り4,308,700千円となります。
短期借入金(F4)+長期借入金(F9)=4,308,700千円

短期借入金とは、銀行などにより借り入れた金額のうち、返済期限が1年以内のものをいい、長期借入金とは返済期限が1年以上のものをいいます。

運転資本と借入金の関係

 

結論
借入金総額は運転資金以内に収まっているので妥当と判断

借入金(43億円)は、運転資金(44億円)以内ですので、事業運営において必要な資金のみ借入調達していると判断できます。

もしも借入金の額が運転資金の額を超える場合には、その超える分他の資産(たとえば固定資産)のために資金を調達していることになります。

調達した資金が運転資金で消えてしまうことは、借り入れる側としてよいことではありません。
同じ借入総額であれば、売掛金を早く回収して、在庫の回転率を上げて在庫を減らし、なるべく運転資金を少なくすればその浮いた分を投資や固定資産の購入などに充てることができます。

逆に銀行から見た場合、貸した資金(貸付金)が運転資金のみに使用され他の固定資産の購入などに使われていないとすれば、安心の面はあります。

仮に今会社が倒産し、貸付金がどれくらい回収できるかを考えてみた場合、運転資金のみに貸付金が使われているのであれば、売掛債権を回収して、在庫を売り切り、買掛債務を返済した後の資金で貸付金の回収が可能となります。

貸付金が固定資産の購入に使われている場合には、その固定資産を売却した資金で貸付金を回収しなければならないため、貸す側としてはその固定資産がはたして売却できるのか、または売却してお金になるのか不安なところです。

よって、貸す側(銀行)としては、貸した資金が運転資金のみに使用されているのであれば安全とみなします。

もちろん、運転資本を構成する売掛金、在庫などに不良が混ざっていないことが前提です。

さらに
流動資産>流動負債+固定負債 となっていたら安全です。
会社を清算するとしても、流動資産(1年以内で資産化できるもの)のみで負債の総額を返済できてしまうのですから。

バランスシートから計算してみると次のようになります。

① 流動資産=6,891,700千円(C2)
② 負債合計=7,154,000千円(F2+F8 )
①-②=▲262,300千円

2.6億円ほど不足していますが、ほぼ流動資産のみで負債総額を返済できるのでバランスシートは健全であり、「借入金総額43億円は妥当な大きさである」と評価することができるのではないでしょうか。

Pythonでパスワードを生成する

要件
文字や数値を入れた箱から、1つづつランダムに選び出し、それらを連結した文字列を作成する。

パスワードを生成する時などに使えます。

コード

import string
import secrets

def pass_gen(size=10):
chars = string.ascii_uppercase + string.ascii_lowercase + string.digits

return ”.join(secrets.choice(chars) for x in range(size))

print(pass_gen(6))

GAQK0FUENn

 

手順

1.chars変数に、パスワードで使用する文字・数字を代入します。

2.そのchars変数からひとつづつ文字・数値をランダムに抽出します。

3.抽出された文字・数値を結合してパスワードが出来上がります。

 

 

説明

1.chars変数に代入する文字・数値について

 ① string.ascii_uppercase
       大文字 ‘ABCDEFGHIJKLMNOPQRSTUVWXYZ’

    ② string.ascii_lowercase
       小文字 ‘abcdefghijklmnopqrstuvwxyz’

    ③ string.digits
       文字列 ‘0123456789’

    ほか
 記号を入れる場合は ’%&$#’ 
 ①と②を合わせたものは string.ascii_letters

 

2.パスワードの文字数について

print(pass_gen(6))
pass_gen( )の中にパスワードの文字数を指定します。
ここでは6つの文字数を指定しています。
数値を指定せずに、print (pass_gen( ) ) とすると、10の文字数のパスワードが出来上がります。
これは最初に、
def pass_gen(size=10):の箇所で
デフォルト値をsize=10としているためです。

 

3.文字の抽出および結合について

secrets.choice(chars) for x in range(size)で文字を抽出しています。
これを ”.join( ) の( )の中に入れることにより、ひとつづつ抽出された文字・数値が結合されます。

”.join( ) の 「” 」はシングルクォーテーションが2つで、文字を連結したい記号を中に入れます。
ここでは、文字を空白で連結したいので”としています。
(” はシングルクォーテーションが2つです)

もしもハイフン(‐)で結合する場合には”の間に「‐」を入れ
‘‐’.join(  ) とします。

カンマ(,)で文字を結合する場合には、”の間に「,」を入れ
‘,’.join(  )とします。

 

パスワードが生成されるイメージ

 

注意

secretsモジュールについて

先のコードでは、乱数を生成するのにsecretsモジュールを使用しています。
乱数を生成するにはrandomモジュールでも生成できますが、あくまでもシミュレーション向けの擬似乱数で,セキュリティや暗号学的に設計されていないようです。

セキュリティ向けの強い乱数を生成できるsecretsモジュールを用いるので、Python3.6以上を利用してください。

IDLEを利用する場合について

先のコードをIDLEのshell画面にコピペすると、次のエラーが出ます。

SyntaxError: multiple statements found while compiling a single statement

IDLEのShell画面では複数行に渡るペーストはできないようです。
複数行のペーストをする場合には、Shell画面のFile>New Fileで出てくる「エディター画面」の方を利用して下さい。

こちらはエディターで、Run>Run Moduleとしてみてください。
実行結果がShell画面の方へ出力されます。

jupyter notebookであればそのままコピペしても大丈夫です。
というより、IDLEのShell画面のみコピペ不可のようです。

民事再生法を申請した取引先との相殺について

突然取引先A社より民事再生法のお知らせが届きました。
また、所有する債権につき次のようなことが書かれていました。


再生債権届出に関する説明
〇〇に対し,再生手続開始の決定がありましたので,再生手続開始決定通知書及び再生債権届出書用紙をお送りします。債権の届出をする方は,下記の説明事項及び同封の記入例をご覧のうえ,届出期限までに同封の返信用封筒でお送りください。
《届出期限》2019年12月20日必着

取引先には1千万円ほどの債権がありましたが、同じくらいの債務がありましたので相殺すればよいと安心していました。

ところが・・結果は債権の一部しか相殺できませんでした。

いざというときに相殺できるように債権管理には気を付けてきたはずが、
結局800万円の未回収が残ってしまいました。

今後のためにも議事録で残しておきたいと思います。

債権/債務の状況

A社への債権と債務の状況は次の通りでした。

A社への債権(売掛金)残高 1,000万円
NO  回収期日     回収金額
1  2019年12月10日   200万円
 2   2020年1月10日     500万円
3  2020年2月10日     300万円


A社への債務(買掛金)残高 1,000万円
NO      支払期日       支払金額
1       2020年1月31日  1,000万円

 

ポイントは、次の3つの期日にあります。
①債権届の提出期限日
②債権の回収日
③債務の支払日

相殺できるのは、債権届の提出期限までです。
債権届の提出期限は先方からの通知書にも書かれていた通り
2019年12月20日です。

よって、この期日までなら相殺は可能です。
しかし、相殺できるのは売掛金の回収日がそれまでに来るものしか相殺できません。

これは「期限の利益」といい、期限がくるまでは支払いをしなくてもよい(当社にとっては回収できない)というものです。

つまり、債権届の提出期限までに売掛金の期日が来るものしか相殺できません。
当社の状況においては、債権NO.1の回収期日が12月10日となっているもののみ相殺が可能であり、NO.2とNO.3は相殺できないことになります。

債務においては支払日が2020年1月31日ですが、期限の利益を放棄することにより相殺が可能となります。
債務においては、期限の利益を持っているのは当社です。
期限がくるまでは支払わなくてもよいという利益を持っていますが、
それを放棄するのは当社の勝手です。(先方に承諾を得るものではありません)

結果として次のようになりました。
2019年12月10日 200万円を相殺する 
2019年12月15日 相殺通知書を発送する
2019年12月16日 800万円を債権残高として債権届を発送する
2020年 1月31日    800万円を支払う

これにより、債権の800万円が未回収として残り、今後の再建手続きにより支払いが確定するとのことです。
すべて支払われるかわかりませんが、後は待つことしかできません。

反省点

反省点は何といっても、売買契約書がなかったことです。
また、特に次のような条項がとても重要です。

期限の利益喪失条項
乙(債務者)が前項各号(解除事由)のいずれかに該当した場合、乙(債務者)は、当然に期限の利益を失い、甲(債権者)に対して本契約に基づいて負担する一切の金銭債務を直ちに弁済するものとする。

これがあれば、NO2とNO3の債権についても、期限の利益は喪失され回収期日を待たずして回収が可能となります。
つまり、債権届の期限までに相殺が可能ということになります。

やはり与信管理において、販売契約書を結ぶことはとても重要ですね。
既存の得意先に対して、今さら契約書を結んでくださいとは言いづらいと思いますが、会社のルールでどうしてもなどと、会社の法務部を悪者にしたらよいかもしれません。

数値の処理方法 – 桁区切り / format関数 / python

桁の大きな数字を記載する時には、3桁ごとにカンマで区切るのがマナーです。

いくら数字に慣れている人でも、「100000000」をすぐに1億だと判断できる人はいないと思います。

この3桁区切りは、特に英語では理解が簡単です。

英語では、1(one) ,  10(ten) ,  100(hundred)  の後は次のように3桁ごとに単位が用意されています。

1,000=thousand
1,000,000=million
1,000,000,000=billion
1,000,000,000,000=trillion

このように区切りがあることにより、大きな数字でも簡単に読むことができます。

5,000は、5と1,000(thousand)だから「five thousand」
50,000は、50と1,000(thousand)だから「fifty thousand」
500,000は、500と1,000(thousand)だから「five hundred thousand」

5,000,000 は、5と1,000,000(million)だから「five million」
50,000,000は、50と1,000,000(million)だから「fifty million」
500,000,000は、500と1,000,000(million)だから「five hundred million」

というように、以下billion, trillion も
50,000,000,000は、50と1,000,000,000(billion)だから「fifty billion」
50,000,000,000,000は、50と1,000,000,000,000(trillion)だから「fifty trillion」

とすぐに読むことができます。

というわけで、pythonで数字に桁区切りする方法を記述します。

桁区切りなし

ave_v=766666
print(ave_v)
>>> 766666

「ave_v」は変数で、数値が代入されています。

 

桁区切りあり

ave_v=766666
print( ” {:,} ” . format(ave_v) )
>>> 766,666

桁区切りをつけるには、
 ” {:,} ” . format(     ) 
とします。

format(   ) に数値または数値が代入されている変数を入れます。

それをprint(   )  で囲むと
>>> 766,666 と表示されます。
 

文字を付加する

ave_v=766666
print(“売上合計は”+”{:,}”.format(ave_v) + “円です”)
>>> 売上合計は766,666円です

文字を不可して表示させるには、
文字を「 ”   ”  」で囲んで、「+」でつなげます。

“売上合計は”  + ” {:,} ” . format(     ) + ” 円です”   
とします。

format(   ) に数値または数値が代入されている変数を入れます。

それをprint(   )  で囲むと
>>> 売上合計は766,666 円です
と表示されます。
 

桁区切りと小数点以下を表示する

ave_v=766666.66666
print(“売上合計は”+”{:,.2f}”.format(ave_v) + “円です”)
>>> 売上合計は766,666.67円です

 

小数点がある場合、
たとえば小数第2位まで表示させる場合は、波カッコの中を {:,.2f} とします。

小数第3位まで表示させる場合は、{:,.3f} とします。

{ コロン(:)  カンマ(,) ピリオド(.)  小数点桁数 f  } となります。


 

小数点を正しく十進法で表示する方法 – decimal / python

小数点以下を四捨五入する場合、次のように思わぬ答えが返る場合があります。


ave_v = round (1.25,1)
print(ave_v)
>>>1.2  ← 1.3のはずが・・

ave_v = round (1.35,1)
print(ave_v)
>>>1.4 ← 合ってる

 

ave_v = round (1.45,1)
print(ave_v)
>>>1.4 ← 1.5 のはずが・・

 

私たちが使い慣れているのは10進数での数値表現ですが、コンピュータは2進数で数値を表現します。
10進数と2進数の間の変換には誤差が伴います。

 

ひとつの誤差は小さいものでも、計算の過程で蓄積されていくと、最後には大きな差になる可能性もあります。

また、if により条件分岐させる場合、
AとBが一致するはずが、不一致とされて異なる処理になってしまう可能性もあります。

A = 0.1
B = 0.2
C = 0.3

if A+B==C:
    print(‘OK’)
else:
    print(‘NO’)
>>> NO  ← OK のはずなのに・・

 

これは「A+B」で返る値が微小に異なるからです。

A = 0.1
B = 0.2
print(A+B)
>>> 0.30000000000000004

 

財務においては、数値は正確に算出しなければなりません。
Pythonでは浮動小数点数の値を正確に計算することができるdecimalモジュールが用意されていますので、こちらを利用する必要があります。

 

 

十進法で正確に計算する
from decimal import Decimal

A = Decimal(“0.1”)
B = Decimal(“0.2”)

print(A + B)

>>> 0.3

 

解説

import 文によりDecimal モジュールをインポートします。

「import  decimal 」
とだけで記述してもよいのですが、その場合には

A= decimal. Decimal (“0.1”)
のように、「decimal. Decimal」と記述する必要があります。

 

Decimal ( ) には数値が入りますが、「”  ” 」または「’   ‘ 」を付けて文字列とする必要があります。
Decimal(“0.1”)の代わりに、Decimal( str(0.1) ) としてもOKです。

 

文字列としなかった場合、エラーが出てくれれば間違いに気づきますが、
次のようにエラーが出ずに誤差が出てしまうので注意が必要です。

A = Decimal(0.1)
B = Decimal(0.2)
print(A + B)
>>> 0.3000000000000000166533453694


 

任意の桁で四捨五入する

from decimal import Decimal, ROUND_HALF_UP

A=Decimal(“1.456”).quantize(Decimal(“0”),rounding=ROUND_HALF_UP)
print(A)
>>>1

B=Decimal(“1.456”).quantize(Decimal(“0.1”),rounding=ROUND_HALF_UP)
print(B)
>>>1.5


C=Decimal(“1.456”).quantize(Decimal(“0.01”),rounding=ROUND_HALF_UP)
print(C)
>>>1.46



 

解説

四捨五入する場合には、
decimalモジュールの「quantizeメソッド」を使用することで、小数点を指定した桁数で丸めることができます。

 

from decimal import Decimal, ROUND_HALF_UP
モジュールをインポートします。

 

Decimal(“  ”).
対象となる値を入力します。

 

quantize(Decimal(“ ”)
整数で丸める場合には、quantize(Decimal(“0”)とします。
小数点第1位まで求める場合には、quantize(Decimal(“0.1”)とします。
小数点第2位まで求める場合には、quantize(Decimal(“0.01”)とします。

 

rounding=ROUND_HALF_UP
引数roundingにROUND_HALF_UPを指定することで繰り上げによる四捨五入を行うことができます。