不動産を学ぼう!
不動産テック

【不動産ビッグデータ】
不動産データ分析のためのPython基礎文法、総まとめ集!ビッグデータを持つ不動産業界に活かせるコード!不動産テックに興味ある方に見てほしい!

この記事で分かること

不動産ビッグデータ分析に必要なPythonコード基礎知識
Part1:Pythonの基礎
Part2:条件分岐・比較演算子の基礎
Part3:ループ処理の基礎
Part4:リストの基礎
Part5:辞書(ディクショナリ)の基礎
Part6:多次元リストの理解
Part7:関数
Part8:クラス1
Part9:クラス2
Part10:例外処理

シマ
シマ
皆さん、こんにちは。シマです(@fudousan_jisho)。この記事では、不動産ビッグデータ分析に必要なプログラミング知識であるPythonの基礎文法を記載していきます。

不動産業界には、様々なビッグデータが眠っています
ただ、他の業界に比べるとまだまだアナログなやり方が残っています。
本記事では、不動産ビッグデータ活用にご興味ある方向けに、Pythonの基礎文法をまとめます。

少しずつ追加していきますので完成までに少し時間がかかってしまうかもしれませんが、不動産ビッグデータ分析の参考として頂けましたら幸いです

↓今回の記事執筆にあたり利用・参考にしたもの
Mac Book Air
※私自身はこのMac Book Airを購入してから本当に人生が変わりました(笑)。今まで使う側でしかなかったアプリを、自ら開発することができたり、プログラミングやデータ分析が楽しくなりました。10~15万円程度の出費とはなりますが、すぐに元手は回収できると思いますので、迷われている方はすぐ購入されることをおススメします!
Python 1年生 体験してわかる!会話でまなべる!プログラミングのしくみ

目次
  1. Python入門1: プログラミングの基礎
    1. Pythonとは?(不動産データ分析に利用可能!
    2. Pythonコード記載(不動産データ分析に利用可能!
    3. コメント(コードの意味を注釈
    4. HTML表示(不動産ウェブサイト作成など
    5. 変数を使う(不動産情報を整理など
    6. ランダム数字を選ぶ(マンションの抽選会など
    7. 演算子で計算(不動産収支を合計など
    8. 値段を計算する(不動産購入総額を計算など
    9. データの型、数値列・文字列(コードを分類
  2. Python入門2: 条件分岐、比較演算子の基礎
    1. 条件分岐の基礎(不動産購入or購入しない
    2. 複数条件の組合せ(不動産購入or値段交渉or購入しない
    3. 比較演算子で条件分岐(不動産購入or購入しない
    4. ランダム抽出・条件分岐1(マンション抽選会など
    5. ランダム抽出・条件分岐2(マンション抽選会など
    6. 西暦から元号年を求める(契約年、建築年など
  3. Python入門3: ループ処理の基礎
    1. 数値をループ(月額賃料を表示など
    2. 条件に合わせて繰り返す1(月額賃料を表示など
    3. 条件に合わせて繰り返す2(ローン返済期間など
    4. 繰り返しでHTML作成(年収などプルダウン表示
    5. データ読み込み(不動産データの読み込み
    6. 複数データ読み込み(不動産データの読み込み
    7. 西暦と平成年の対応表(建築年・取得年の表示など
  4. Python入門4: リストの基礎
    1. リストとは?(不動産・顧客情報の整理
    2. リスト作成(不動産・顧客情報の整理
    3. リストの要素取り出し(不動産・顧客情報の整理
    4. リスト操作(不動産・顧客情報の整理
    5. ループでリスト処理(不動産・顧客情報の整理
    6. カンマ区切りデータをsplit分割(不動産・顧客情報の整理
    7. 複数行データをリストに格納(不動産・顧客情報の整理
    8. リストを使ったランダム処理(検討可能物件を表示など
  5. Python入門5: 辞書(ディクショナリ)の基礎
    1. 辞書とは?(アセットタイプ別分類など
    2. 辞書作成(アセットタイプ別分類など
    3. 辞書の基本操作(アセットタイプ別分類など
    4. 辞書をループで処理する(エリアとアセットタイプ分類
    5. リストの整列(アセットタイプ別整列
    6. 辞書の配列(ビルと金額を配列
    7. 物件一覧を表示1(アセットタイプと画像を表示
    8. 物件一覧を表示2(アセットタイプと画像を表示
  6. Python入門6: 多次元リスト理解
    1. 2次元リストとは?(不動産・顧客情報の整理
    2. 2次元リスト作成(アセット管理
    3. 2次元リスト操作1(アセット管理
    4. 2次元リスト操作2(アセット管理
    5. ループでリスト処理(アセット管理
    6. 2次元リストでfor作成(アセット管理
    7. ドット絵表示(住宅街の空き家管理
    8. 3次元リストで複数ドット絵表示(住宅街の空き家管理
    9. enumerateで2次元リスト操作(地図上に立地を表示
    10. 2次元リストマップに道路追加(地図上に立地を表示
    11. 標準入力から2次元リスト(地図上に立地を表示)
    12. 2次元リストで画像配置(立地と物件画像を配置
  7. Python入門7: 関数
    1. 関数とは?(膨大な不動産データを整理
    2. 関数作成(膨大な不動産データを整理
    3. 引数と戻り値追加(単価と戸数・棟数で総額計算
    4. スコープ(不動産投資家を再現
    5. スコープの実践(不動産投資家を再現
    6. 引数のデフォルト値(投資家の属性分類など
    7. キーワード引数(投資家の属性分類など
  8. Python入門8: クラス1
    1. クラスとは?(投資家や投資物件の分類など
    2. クラス作成(投資家と投資物件の分類など
    3. 変数でクラス管理(投資家分類など
    4. オブジェクトの具体例(投資家分類など
    5. 引数と戻り値のあるメソッド(購入金額を計算など
    6. 文字列とリストのメソッド(アセットをリスト化など
    7. アクセス制限(投資家・アセット分類など
  9. Python入門9: クラス2
    1. クラスの続き(投資家・アセット分類など
    2. クラス承継(投資家・アセット分類など
    3. メソッドのオーバーライド(投資家・アセット分類など
    4. クラスを承継(各投資家の動きを確認
    5. クラスからメソッドを呼び出し(各投資家の動きを確認
    6. クラス変数とクラスメソッド(各投資家の動きを確認
    7. 標準ライブラリ読み込み(契約日時を表示など
  10. Python入門10: 例外処理
    1. 例外処理の概要(データ分析エラー処理
    2. 簡単な例外処理(データ分析エラー処理
    3. 様々な形式での例外処理(データ分析エラー処理
    4. 発生させる例外変更(データ分析エラー処理
    5. 複数の例外補足(データ分析エラー処理
    6. raiseで意図的に例外を投げる(データ分析エラー処理
    7. 例外は伝わる(データ分析エラー処理
    8. finally理解(データ分析エラー処理

Python入門1: プログラミングの基礎

Pythonとは?(不動産データ分析に利用可能!

Pythonとは
すばやく効果的にシステムを開発できるよう作られた汎用プラグラミング言語

Pythonの特徴
スクリプト言語で開発が容易
様々なライブラリがある(例、マッピングなど)

Pythonでできること
機械学習・AI、データ・統計分析など

Pythonコード記載(不動産データ分析に利用可能!

# Hello RealEstateと表示する

# 【入力内容】

print("Hello RealEstate!")

# 【実行結果(例)】

Hello World!

コメント(コードの意味を注釈

# コメントを入力する

# 【入力内容】

print("Hello RealEstate1")
# print("Hello RealEstate2")
'''
print("Hello RealEstate3")
print("Hello RealEstate4")
'''

# 【実行結果(例)】

Hello RealEstate1

HTML表示(不動産ウェブサイト作成など

#HTMLを表示する

# 【入力内容】

#HTMLを表示する
print("Hello RealEstate")
print("投資家の皆さん")
print("こんにちは")

# 【実行結果(例)】

Hello RealEstate
投資家の皆さん
こんにちは

変数を使う(不動産情報を整理など

# 変数を使う

# 【入力内容】

investor = "投資家"
print(investor)
print(investor + "は、マンションに投資した。")
print(investor + "は、オフィスに投資した。")
print(investor + "は、店舗に投資した。")

# 【実行結果(例)】

投資家
投資家は、マンションに投資した。
投資家は、オフィスに投資した。
投資家は、店舗に投資した。

ランダム数字を選ぶ(マンションの抽選会など

#数の表示とサイコロ

# 【入力内容】

import random
room_number = random.randint(501,520)
print("マンションの5階部分の抽選で" + str(room_number) + "号の部屋が当たった!")

# 【実行結果(例)】

マンションの5階部分の抽選で502号の部屋が当たった!

演算子で計算(不動産収支を合計など

# 演算子で計算する

# 【入力内容】

tax = 100
maintenance = 200
print(tax + maintenance)

# 【実行結果(例)】

300

値段を計算する(不動産購入総額を計算など

#値段を計算する

# 【入力内容】

import random
#room_price	マンションの単価
room_price = 1
#room_num	マンションを買う数
room_num = random.randint(1,10)
print("マンションの単価:" + str(room_price) + "千万円")
print("マンションを買う数:" + str(room_num) + "戸")
total = room_price * room_num
print("合計金額:" + str(total) + "千万円")

# 【実行結果(例)】

マンションの単価:1千万円
マンションを買う数:8戸
合計金額:8千万円

データの型、数値列・文字列(コードを分類

# データの種類

# 【入力内容】

residence_office = 1 + 2 		#数値
strings = "住宅" + "&オフィス"	#文字列
print(residence_office)
print(strings)
print(strings + "を" + str(residence_office) + "千万円で購入!")

# 【実行結果(例)】

3
住宅&オフィス
住宅&オフィスを3千万円で購入!

Python入門2: 条件分岐、比較演算子の基礎

条件分岐の基礎(不動産購入or購入しない

# if文による条件分岐

# 【入力内容】

price = 2000
if price == 2000:
    print( "ワンルームを購入する")  #条件式が成立したときの処理
else:
    print( "ワンルームを購入しない")  #条件式が成立しなかったときの処理

# 【実行結果(例)】

ワンルームを購入する

複数条件の組合せ(不動産購入or値段交渉or購入しない

# if文による条件分岐 elif文

# 【入力内容】

price = 2500
if price == 2000:
	print("ワンルームを購入する!")	#条件式1が成立したときの処理
elif price == 2500:
    print("値段の交渉をする!")	#条件式2が成立したときの処理
else:
	print("ワンルームを購入しない")	#条件式がどれも成立しなかったときの処理

# 【実行結果(例)】

値段の交渉をする!

比較演算子で条件分岐(不動産購入or購入しない

# if文による条件分岐 比較演算子

# 【入力内容】

# if文による条件分岐 比較演算子
price = 1800
if price <= 2000: print("ワンルームを購入する!") #条件式が成立したときの処理 # price == b :priceはbと等しい # price > b  :priceはbより大きい
# price < b :priceはbより小さい # price >= b :priceはb以上
# price <= a :priceはb以下
# price != b :priceはbと等しくない

# 【実行結果(例)】

ワンルームを購入する!

ランダム抽出・条件分岐1(マンション抽選会など

# マンションの抽選会を再現
# 比較演算子 == > < >= <= !=
# 南向き 東向き 西向き 北向き ワケあり

# 【入力内容】

import random
chusen = random.randint(501,510)

if chusen == 501:
    print("南向きの部屋")
elif chusen == 502:
    print("東向きの部屋")
elif chusen <= 504:
    print("西向きの部屋")
elif chusen <= 507:
    print("北向きの部屋")
else:
    print("ワケありの部屋")

# 【実行結果(例)】

ワケありの部屋

ランダム抽出・条件分岐2(マンション抽選会など

# マンションの抽選会を再現
# 比較演算子 == > < >= <= !=
# 501から510のくじを引いて、
# 506未満の場合、南向きの部屋が当選!と表示。
# 506以上の場合、東向きの部屋が当選!と表示。

# 【入力内容】

import random
chusen = random.randint(501,510)

if chusen < 506:
    print("南向きの部屋が当選!")
else:
    print("東向きの部屋が当選!")

# 【実行結果(例)】

南向きの部屋が当選!

西暦から元号年を求める(契約年、建築年など

# 契約した年、西暦年から平成年を求める
# 西暦年から平成年を計算する
# 平成1年とは、西暦1989年
# 西暦年 - 1988 = 平成*年

# 【入力内容】

import datetime
seireki = datetime.date.today().year
print("西暦" + str(seireki) + "年は、", end="")
heisei = seireki - 1988
print("平成" + str(heisei) + "年です")

# 【実行結果(例)】

西暦2021年は、平成33年です

Python入門3: ループ処理の基礎

数値をループ(月額賃料を表示など

# for inによるループ処理

# 【入力内容】

for i in range(1,13):
    print(str(i) + "月の賃料収入")

# 【実行結果(例)】

1月の賃料収入
2月の賃料収入
3月の賃料収入
4月の賃料収入
5月の賃料収入
6月の賃料収入
7月の賃料収入
8月の賃料収入
9月の賃料収入
10月の賃料収入
11月の賃料収入
12月の賃料収入

条件に合わせて繰り返す1(月額賃料を表示など

# whileによるループ処理

# 【入力内容】

i = 1 #カウンタ変数を初期化
while i <= 12:
    print(str(i) + "月の賃料")
    i = i + 1

# 【実行結果(例)】

1月の賃料
2月の賃料
3月の賃料
4月の賃料
5月の賃料
6月の賃料
7月の賃料
8月の賃料
9月の賃料
10月の賃料
11月の賃料
12月の賃料

条件に合わせて繰り返す2(ローン返済期間など

# whileによるループ処理

# 【入力内容】

i = 10 # カウンタ変数を初期化
while i >= 1:
    print("ローン返済期間残り" + str(i) + "年") # 繰り返し処理
    i -= 1 # カウンタ変数を更新
print("last:" + str(i))

# 【実行結果(例)】

ローン返済期間残り10年
ローン返済期間残り9年
ローン返済期間残り8年
ローン返済期間残り7年
ローン返済期間残り6年
ローン返済期間残り5年
ローン返済期間残り4年
ローン返済期間残り3年
ローン返済期間残り2年
ローン返済期間残り1年
last:0

# whileによるループ処理(ランダム)

# 【入力内容】

import random
loan = 5000
while loan > 0:
    loan_return = random.randint(300,1000)
    print("ローンを今年は、" + str(loan_return) + "万円返済した!")
    loan -= loan_return
print("ローンを完済した!")

# 【実行結果(例)】

ローンを今年は、524万円返済した!
ローンを今年は、769万円返済した!
ローンを今年は、457万円返済した!
ローンを今年は、364万円返済した!
ローンを今年は、896万円返済した!
ローンを今年は、426万円返済した!
ローンを今年は、713万円返済した!
ローンを今年は、791万円返済した!
ローンを今年は、711万円返済した!
ローンを完済した!

繰り返しでHTML作成(年収などプルダウン表示

# 会員登録時の顧客属性(年収)のプルダウン作成

# 【入力内容】

※HTML形式変換の文字化け防止で、タグのカッコを省略。コーディングの際はタグ設定ください。

print("select name=\'age\'")
for salary in range(10):
    print("option" + str(salary + 1) + "百万円/option")
print("/select")

# 【実行結果(例)】

select name='salary'
option1百万円/option
option2百万円/option
option3百万円/option
option4百万円/option
option5百万円/option
option6百万円/option
option7百万円/option
option8百万円/option
option9百万円/option
option10百万円/option
/select

データ読み込み(不動産データの読み込み

# inputによる入力処理

#標準入力

不動産

# 【入力内容】

line = input()
print("hello " + line)

# 【実行結果(例)】

hello 不動産

複数データ読み込み(不動産データの読み込み

# 標準入力とループ処理

#標準入力

3
マンション
店舗
オフィス

# 【入力内容】

count = int(input())
print("物件戸数 " + str(count))
for i in range(count):
    asset = input().rstrip()
    print("見つけた!良い" + asset)

# 【実行結果(例)】

物件戸数 3
見つけた!良いマンション
見つけた!良い店舗
見つけた!良いオフィス

西暦と平成年の対応表(建築年・取得年の表示など

# 西暦年と平成年の対応表を作る
# 1989年から2000年までをループで出力
# ループ内で、各西暦年を平成年に変換

# 【入力内容】

for seireki in range(1989, 2000):
    print("建築年の西暦" + str(seireki) + "年は、", end = "")
    heisei = seireki - 1988
    print("平成" + str(heisei) + "年です。")

# 【実行結果(例)】

建築年の西暦1989年は、平成1年です。
建築年の西暦1990年は、平成2年です。
建築年の西暦1991年は、平成3年です。
建築年の西暦1992年は、平成4年です。
建築年の西暦1993年は、平成5年です。
建築年の西暦1994年は、平成6年です。
建築年の西暦1995年は、平成7年です。
建築年の西暦1996年は、平成8年です。
建築年の西暦1997年は、平成9年です。
建築年の西暦1998年は、平成10年です。
建築年の西暦1999年は、平成11年です。

Python入門4: リストの基礎

リストとは?(不動産・顧客情報の整理

リストとは?

  • リストとは、まとまったデータを便利に扱うことができるデータ構造。
  • インデックスと呼ばれる番号で、それぞれのデータを区別。
    (※リストの番号は、「1」ではなく、「0」からスタート)
  • 他のプログラミング言語では「配列」と呼ばれる機能が、Pythonでは「リスト」という名前に。

リストの使う場面

  1. 並び順管理が必要なデータ処理
    – 物件の情報を列挙
  2. 顧客Webフォームの選択肢
    – 年齢、年収、希望エリアなど
  3. エクセルのような複数行データ
    – CSVデータの処理

リスト作成(不動産・顧客情報の整理

# リストを作成する

# 【入力内容】

investor_1 = "投資家A"
investor_2 = "投資家B"

print(investor_1)
print(investor_2)

investors = ["投資家C", "投資家D", 100, investor_1]
print(investors)

# 【実行結果(例)】

投資家A
投資家B
['投資家C', '投資家D', 100, '投資家A']

リストの要素取り出し(不動産・顧客情報の整理

# リストの要素を取り出す

# 【入力内容】

investors = ["投資家A", "投資家B", "投資家C"]
print(investors)
print(investors[0])
num = 1
print(investors[num])
print(investors[num + 1])
print(len(investors))

# 【実行結果(例)】

['投資家A', '投資家B', '投資家C']
投資家A
投資家B
投資家C
3

リスト操作(不動産・顧客情報の整理

# リストの要素を操作する

# 【入力内容】

investors = ["投資家A", "投資家B"]
print(investors)
print(investors[0])
print(len(investors))

investors.append("投資家C")
print(investors)
print(len(investors))

investors = "投資家D"
print(investors)
print(len(investors))

investors.pop(2)
print(investors)
print(len(investors))

# 【実行結果(例)】

['投資家A', '投資家B']
投資家A
2
['投資家A', '投資家B', '投資家C']
3
['投資家A', '投資家B', '投資家D']
3
['投資家A', '投資家B']
2

ループでリスト処理(不動産・顧客情報の整理

# ループでリストを操作する

# 【入力内容】

※HTML形式変換の文字化け防止で、タグのカッコを省略。コーディングの際はタグ設定ください。

investors= ["投資家A", "投資家B", "投資家C", "投資家D"]
# print(investors)
# print(investors[0])

print("select name = 'investor_name'")
for investor_name in investors:
    print("option" + investor_name + "/option")
print("/select")

# 【実行結果(例)】

select name = 'investor_name'
option投資家A/option
option投資家B/option
option投資家C/option
option投資家D/option
/select

カンマ区切りデータをsplit分割(不動産・顧客情報の整理

# 取り込んだデータをリストに格納する

#標準入力

投資家A,投資家B,投資家C,投資家D

# 【入力内容】

investors = input().rstrip().split(",")
print(investors)
print(len(investors))

for investor in investors:
    print(investor + "が物件を購入した!")

# 【実行結果(例)】

['投資家A', '投資家B', '投資家C', '投資家D']
4
投資家Aが物件を購入した!
投資家Bが物件を購入した!
投資家Cが物件を購入した!
投資家Dが物件を購入した!

複数行データをリストに格納(不動産・顧客情報の整理

# 複数行データをリストに格納する

#標準入力

投資家Aはマンションを購入
投資家Bはオフィスを購入

投資家Cは店舗を売却
投資家Dはホテルを売却

# 【入力内容】

import sys
array = []
for investor in sys.stdin.readlines():
    array.append(investor.rstrip())
    # print(investor.rstrip())

print(array)

# 【実行結果(例)】

['投資家Aはマンションを購入', '投資家Bはオフィスを購入', '', '投資家Cは店舗を売却', '投資家Dはホテルを売却']

リストを使ったランダム処理(検討可能物件を表示など

# リストを使ったランダムくじ
# レジ,オフィス,商業,物流

#標準入力

レジ,オフィス,商業,物流

# 【入力内容】

import random
assets = input().rstrip().split(",")
for asset_type in assets:
	print(asset_type + "を購入したい")

# ランダムな数を作る範囲を調べる
num = len(assets)
print("合計は" + str(num) + "棟")

# ランダムな数を生成
invest = random.randrange(num)

# 選んだ際に「会心の一撃!」と表示
print(assets[invest] + "の優良物件を発見!" + assets[invest] + "を早速購入!")

# 【実行結果(例)】

レジを購入したい
オフィスを購入したい
商業を購入したい
物流を購入したい
合計は4棟
物流の優良物件を発見!物流を早速購入!

Python入門5: 辞書(ディクショナリ)の基礎

辞書とは?(アセットタイプ別分類など

辞書とは?

  • まとまったデータをテキスト(キー)で扱う
  • リストとの比較
    (リストlist[0] = “レジ”、辞書dict[“戸建”] = “レジ”)

辞書の基本機能

  • データの追加・更新・削除が容易にできる
    ・print(dict[“戸建”]]
    ・dict2 = “アパート” → print(dict[dict2])
    ・print(len(dict))

辞書の使いどころ

  • データベースとやり取りするデータ処理
  • APIとやり取りするデータ処理

辞書作成(アセットタイプ別分類など

# リストのおさらい

# 【入力内容】

assetArray = ["レジ", "オフィス", "店舗", "ホテル"]
print(assetArray)
print(assetArray[0])

# 辞書の具体例
assetDictionary = {"住居系":"レジ", "事務所系":"オフィス", "店舗系":"店舗"}
print(assetDictionary)
print(assetDictionary["住居系"])
print(assetDictionary["事務所系"])

level = "店舗系"
print(assetDictionary[level])

# 【実行結果(例)】

['レジ', 'オフィス', '店舗', 'ホテル']
レジ
{'住居系': 'レジ', '事務所系': 'オフィス', '店舗系': '店舗'}
レジ
オフィス
店舗

辞書の基本操作(アセットタイプ別分類など

# 辞書の基本操作

# 【入力内容】

category = {"タイプ1":"マンション", "タイプ2":"オフィス", "タイプ3":"商業"}
print(category)
print(category["タイプ2"])
print(len(category))

category["タイプ4"] = "ホテル"
print(category)
print(len(category))

category["タイプ1"] = "アパート"
print(category)
print(len(category))

del category["タイプ3"]
print(category)
print(len(category))

# 【実行結果(例)】

{'タイプ1': 'マンション', 'タイプ2': 'オフィス', 'タイプ3': '商業'}
オフィス
3
{'タイプ1': 'マンション', 'タイプ2': 'オフィス', 'タイプ3': '商業', 'タイプ4': 'ホテル'}
4
{'タイプ1': 'アパート', 'タイプ2': 'オフィス', 'タイプ3': '商業', 'タイプ4': 'ホテル'}
4
{'タイプ1': 'アパート', 'タイプ2': 'オフィス', 'タイプ4': 'ホテル'}
3

辞書をループで処理する(エリアとアセットタイプ分類

# 辞書をループで処理する

# 【入力内容】

categories = {"東京":"マンション", "大阪":"オフィス", "名古屋":"商業"}
print(categories)
print(categories["大阪"])

# アセットタイプだけループ処理
for asset in categories:
    print(categories[asset] + "の売買契約を締結する!")
# エリアおよびアセットタイプをループ処理
for (area, category) in categories.items():
    print(asset + "の" + category + "の売買契約を締結する!")

# 【実行結果(例)】

{'東京': 'マンション', '大阪': 'オフィス', '名古屋': '商業'}
オフィス
マンションの売買契約を締結する!
オフィスの売買契約を締結する!
商業の売買契約を締結する!
名古屋のマンションの売買契約を締結する!
名古屋のオフィスの売買契約を締結する!
名古屋の商業の売買契約を締結する!

リストの整列(アセットタイプ別整列

# リストの整列

# 【入力内容】

asset_type = ["マンション", "オフィス", "リテール", "ホテル"]
print(asset_type)

# 五十音順、もしくは、その逆で並べるコード
print(sorted(asset_type))
print(sorted(asset_type, reverse=True))

# 数字順で並べるコード
asset_type2 = ["4.マンション", "1.オフィス", "3.リテール", "2.ホテル"]
print(sorted(asset_type2))

# 漢字にすると、必ずしも五十音順になるとは限らないので注意
asset_type3 = ["住宅", "事務所", "商業", "旅館"]
print(sorted(asset_type3))

# 【実行結果(例)】

['マンション', 'オフィス', 'リテール', 'ホテル']
['オフィス', 'ホテル', 'マンション', 'リテール']
['リテール', 'マンション', 'ホテル', 'オフィス']
['1.オフィス', '2.ホテル', '3.リテール', '4.マンション']
['事務所', '住宅', '商業', '旅館']

辞書の配列(ビルと金額を配列

タプル:リストのように様々な値を纏めて管理するデータ構造
リストとの違いは、内容の変更が不可である点。

# 辞書の整列

# 【入力内容】

building = {"ビルA":10, "ビルB":20, "ビルC":30}
print(sorted(building))
print(building)
# タプル化の記述
print(sorted(building.items()))

# 【実行結果(例)】

['ビルA', 'ビルB', 'ビルC']
{'ビルA': 10, 'ビルB': 20, 'ビルC': 30}
[('ビルA', 10), ('ビルB', 20), ('ビルC', 30)]

物件一覧を表示1(アセットタイプと画像を表示

複数のアセットタイプを画像で表示

  • アセットタイプ名とアセット画像を表示
  • 同じアセットタイプを複数表示
  • アセットタイプの並び順を管理
  • 同じアセットタイプの画像ファイルは一つを共有

必要なデータ構造

辞書と配列を組み合わせる
例)並び順用リストasset_orders、画像用辞書asset_images

物件一覧を表示2(アセットタイプと画像を表示

# 画像用ハッシュ

# 【入力内容】

※HTML形式変換の文字化け防止で、タグのカッコを省略。コーディングの際はタグ設定ください。

asset_images = {
    "住宅":"https://fudousan-jisho.com/wp-content/uploads/2021/03/residence.jpg",
    "ビル":"https://fudousan-jisho.com/wp-content/uploads/2021/03/office.jpg",
    "ホテル":"https://fudousan-jisho.com/wp-content/uploads/2021/03/hotel.jpg",
    "様々":"https://fudousan-jisho.com/wp-content/uploads/2021/03/many.jpg"
}

# アセットの並び順配列
asset_orders = ["様々", "ビル", "住宅", "ホテル", "ホテル", "ホテル"]

# アセット名を取り出す
for asset_name in asset_orders:
# 画像ファイル名を取り出す
    print("imagesタグ + asset_images[asset_name] + タグ閉")
    print(asset_name)

# 【実行結果(例)】

※HTML形式変換の文字化け防止で、タグのカッコを省略。コーディングの際はタグ設定ください。

imagesタグ='https://fudousan-jisho.com/wp-content/uploads/2021/03/many.jpg'
様々
imagesタグ='https://fudousan-jisho.com/wp-content/uploads/2021/03/office.jpg'>
ビル
imagesタグ='https://fudousan-jisho.com/wp-content/uploads/2021/03/residence.jpg'>
住宅
imagesタグ='https://fudousan-jisho.com/wp-content/uploads/2021/03/hotel.jpg'>
ホテル
imagesタグ='https://fudousan-jisho.com/wp-content/uploads/2021/03/hotel.jpg'>
ホテル
imagesタグ='https://fudousan-jisho.com/wp-content/uploads/2021/03/hotel.jpg'>
ホテル

Python入門6: 多次元リスト理解

2次元リストとは?(不動産・顧客情報の整理

データの集まりを格納

  • 変数  asset = “マンション”
  • リスト asset[0] = “マンション”
  • 辞書  asset[“マンション”] = 5000
  • 2次元リスト asset[数字][数字] = “高級マンション”

つまり、2次元リストは行と列で示されるエクセルセルのようなイメージ

2次元リストの用途

  • マップ
  • 写真等のイメージ
  • 図面
  • 表形式データ
  • 空間座標

2次元リスト作成(アセット管理

# 2次元リスト作成

# 【入力内容】

hotel = "ホテル"
asset_type1 = [hotel, "オフィス", "リテール"]
print(asset_type1)
print(asset_type1[0])

asset_type2 = [asset_type1[0], asset_type1, asset_type1]
print(asset_type2)
print(asset_type2[0])

asset_type3 = ["物流", "病院", "駐車場"]
asset_type4 = ["アパート", "店舗", "老人ホーム"]
asset_type5 = ["戸建", "旅館", "ソーラー用地"]

assets = [asset_type3, asset_type4, asset_type5]
print(assets)
print(assets[0])
print(assets[数字][数字])
print(assets[数字][数字])
print(assets[数字][数字])

# 【実行結果(例)】

['ホテル', 'オフィス', 'リテール']
ホテル
['ホテル', 'オフィス', 'リテール']
ホテル
[['物流', '病院', '駐車場'], ['アパート', '店舗', '老人ホーム'], ['戸建', '旅館', 'ソーラー用地']]
['物流', '病院', '駐車場']
戸建
旅館
ソーラー用地

2次元リスト操作1(アセット管理

# 2次元リストの基本操作1

# 【入力内容】

assets = [["ホテル", "旅館"], ["マンション", "アパート", "戸建"], ["オフィス", "シェアオフィス", "貸し会議室"], ["店舗"]]
print(assets)
print(assets[数字])
print(assets[数字][数字])
print(assets[数字][数字])

assets[0] = "民泊"
print(assets)
print(assets[数字])

# 【実行結果(例)】

[['ホテル', '旅館'], ['マンション', 'アパート', '戸建'], ['オフィス', 'シェアオフィス', '貸し会議室'], ['店舗']]
['ホテル', '旅館']
ホテル
旅館
[['ホテル', '民泊'], ['マンション', 'アパート', '戸建'], ['オフィス', 'シェアオフィス', '貸し会議室'], ['店舗']]
['ホテル', '民泊']

2次元リスト操作2(アセット管理

# 2次元リストの基本操作

# 【入力内容】

teams = [["オフィス", "シェアオフィス"], ["マンション", "アパート", "戸建"], ["ホテル", "旅館", "民泊"], ["店舗"]]
print(teams)

teams.append(["物流", "駐車場", "太陽光"])
print(teams)
print(len(teams))

teams[0].append("老人ホーム")
print(teams)
print(len(teams))
print(len(teams[0]))

del teams[数字]
print(teams)
print(len(teams))

del teams[数字][数字]
print(teams)
print(len(teams))
print(len(teams[数字]))

# 【実行結果(例)】

[['オフィス', 'シェアオフィス'], ['マンション', 'アパート', '戸建'], ['ホテル', '旅館', '民泊'], ['店舗']]
[['オフィス', 'シェアオフィス'], ['マンション', 'アパート', '戸建'], ['ホテル', '旅館', '民泊'], ['店舗'], ['物流', '駐車場', '太陽光']]
5
[['オフィス', 'シェアオフィス', '老人ホーム'], ['マンション', 'アパート', '戸建'], ['ホテル', '旅館', '民泊'], ['店舗'], ['物流', '駐車場', '太陽光']]
5
3
[['オフィス', 'シェアオフィス', '老人ホーム'], ['ホテル', '旅館', '民泊'], ['店舗'], ['物流', '駐車場', '太陽光']]
4
[['オフィス', '老人ホーム'], ['ホテル', '旅館', '民泊'], ['店舗'], ['物流', '駐車場', '太陽光']]
4
2

ループでリスト処理(アセット管理

# ループでリストを処理する

# 【入力内容】

assets = ["マンション", "アパート", "戸建"]
print(assets)
print(assets[0])

for (i, assets) in enumerate(assets):
    print(str(i+1) + "番目の" + assets + "が売買された")

# 【実行結果(例)】

['マンション', 'アパート', '戸建']
マンション
1番目のマンションが売買された
2番目のアパートが売買された
3番目の戸建が売買された

2次元リストでfor作成(アセット管理

# 2次元リストをforで作成する

# 【入力内容】

# 2次元リストをforで作成する

numbers = [i * 数字 for i in range(数字)]
print(numbers)
print(len(numbers))

numbers2 = [[数字 for i in range(数字)] for j in range(数字)]
numbers2[数字][数字] = 数字
print(numbers2)

# 【実行結果(例)】

[0, 2, 4, 6, 8, 10, 12, 14, 16, 18] 
10
[, , , ]

ドット絵表示(住宅街の空き家管理

# ドット絵(住宅街の空き家)を表示する

# 【入力内容】

empty_house = [[0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0],
             ,
             ,
             ,
             [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0],
             [0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0],
             [0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,1]]

for line in empty_house:
    for dot in line:
        if dot == 1:
            print("#", end="")
        else:
            print(" ", end="")
    print()

# 【実行結果(例)】

  ############  
##            ##
#  ###   ###   #
##    ##      ##
 ############## 
   ###     ###  
    ###      ###

3次元リストで複数ドット絵表示(住宅街の空き家管理

# 3次元リストでドット絵を表示する

# 【入力内容】

enemy_img = [[[0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0],
              ,
              ,
              ,
              [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0],
              [0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0],
              [0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,1]],
             [[0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0],
              ,
              ,
              ,
              [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0],
              [0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0],
              [0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0]],
             [[0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0],
              ,
              ,
              ,
              [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0],
              [0,0,1,1,1,0,0,0,0,0,0,1,1,1,0,0],
              ]]

for img in enemy_img:
    for line in img:
        for dot in line:
            if dot == 1:
                print("#", end="")
            else:
                print(" ", end="")
        print()

# 【実行結果(例)】

  ############  
##            ##
#  ###   ###   #
##    ##      ##
 ############## 
   ###     ###  
    ###      ###
  ############  
##            ##
#  ###    ###  #
##     ##     ##
 ############## 
   ###    ###   
   ###    ###   
  ############  
##            ##
#   ###   ###  #
##      ##    ##
 ############## 
  ###      ###  
###       ###   

enumerateで2次元リスト操作(地図上に立地を表示

# 2次元リストで地図を表示する

# 【入力内容】

landmap = [["家" for i in range(20)] for j in range(10)]
landmap[数字][数値] = "宿"
landmap[数値][数値] = "店"
landmap[数値][数値] = "店"
for i,line in enumerate(landmap):
    print(str(i) + ":", end="")
    for area in line:
        print(area, end="")
    print()

# 【実行結果(例)】

0:宿家家家家家家家家家家家家家家家家家家店
1:家家家家家家家家家家家家家家家家家家家家
2:家家家家家家家家家家家家家家家家家家家家
3:家家家家家家家家家家家家家家家家家家家家
4:家家家家家家家家家家家家家家家家家家家家
5:家家家家家家家家家家家家家家家家家家家家
6:家家家家家家家家家家家家家家家家家家家家
7:家家家家家家家家家家家家家家家家家家家家
8:家家家家家家家家家家家家家家家家家家家家
9:家家家家家家家家家家家家家家家家家家家店

2次元リストマップに道路追加(地図上に立地を表示

# 2次元リストで地図を表示する

# 【入力内容】

landmap = [["家" for i in range(20)] for j in range(10)]
landmap[数値][数値] = "宿"
landmap[数値][数値] = "店"
landmap[数値][数値] = "店"
for i,line in enumerate(landmap):
    print(str(i) + ":", end="")
    for j,area in enumerate(line):
        if (i % 2 == 0 or j % 3 == 0) and area == "家":
            print("+", end="")
        else:
            print(area, end="")
    print()

# 【実行結果(例)】

0:宿++++++++++++++++++店
1:+家家+家家+家家+家家+家家+家家+家
2:++++++++++++++++++++
3:+家家+家家+家家+家家+家家+家家+家
4:++++++++++++++++++++
5:+家家+家家+家家+家家+家家+家家+家
6:++++++++++++++++++++
7:+家家+家家+家家+家家+家家+家家+家
8:++++++++++++++++++++
9:+家家+家家+家家+家家+家家+家家+店

標準入力から2次元リスト(地図上に立地を表示)

# 標準入力から、2次元リストを読み込む

# 【入力内容】

# 標準入力のデータ
0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0
1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1
1,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1
1,1,0,0,0,0,1,1,0,0,0,0,0,0,1,1
0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0
0,0,0,1,1,1,0,0,0,0,0,1,1,1,0,0
0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,1
_

# 標準入力から2次元リスト

enemy_img = []
while True:
    line = input()
    if line == "_":
        break
    enemy_img.append(line.split(","))

# print(enemy_img)

for line in enemy_img:
    for dot in line:
        if int(dot) == 1:
            print("#", end="")
        else:
            print(" ", end="")
    print()

# 【実行結果(例)】

  ############  
##            ##
#  ###   ###   #
##    ##      ##
  ############  
   ###     ###  
    ###      ###

2次元リストで画像配置(立地と物件画像を配置

# 2次元リストで画像を配置

# 【入力内容】

# 画像用リスト
asset_types = [
    "https://fudousan-jisho/apartment.png",
    "https://fudousan-jisho/office.png",
    "https://fudousan-jisho/shop.png",
    "https://fudousan-jisho/hotel.png",
    "https://fudousan-jisho/logistics.png"]

# 配置データを読み込み
assets = []
while True:
    line = input()
    if line == "_":
        break
    assets.append(line.split(","))

# 配置に併せて表示
後日追記予定

Python入門7: 関数

関数とは?(膨大な不動産データを整理

関数とは?

  • コードを分割して再利用するための機能
  • 大規模プログラムの開発で必要

関数の働き

  • 長いコードを分割して整理
  • コードに名称を付けられる
  • コードを何度でも呼び出せる
  • コードを組み合わせられる

関数作成(膨大な不動産データを整理

# 関数を作る

# 【入力内容】

def say_hello():
    print("Hello RealEstate!")

say_hello()
say_hello()

# 【実行結果(例)】

Hello RealEstate!
Hello RealEstate!

引数と戻り値追加(単価と戸数・棟数で総額計算

# 引数と戻り値を追加する

# 【入力内容】

def sum(x, y):
    return x + y

price1 = sum(3, 4)
print(price1)
price2 = sum(300, 400)
print(price2)

# 【実行結果(例)】

7
700

# 九九の表を作成

# 【入力内容】

def multiply(x, y):
    return x * y

for step in range(1, 10):
    for num in range(1, 10):
        print(multiply(step, num), end="")
        if num < 9:
            print(", ", end="")
    print("")

# 【実行結果(例)】

1, 2, 3, 4, 5, 6, 7, 8, 9
2, 4, 6, 8, 10, 12, 14, 16, 18
3, 6, 9, 12, 15, 18, 21, 24, 27
4, 8, 12, 16, 20, 24, 28, 32, 36
5, 10, 15, 20, 25, 30, 35, 40, 45
6, 12, 18, 24, 30, 36, 42, 48, 54
7, 14, 21, 28, 35, 42, 49, 56, 63
8, 16, 24, 32, 40, 48, 56, 64, 72
9, 18, 27, 36, 45, 54, 63, 72, 81

スコープ(不動産投資家を再現

# スコープを理解する

# 【入力内容】

message = "fudousan"
a = 10
b = 20

def sum(x, y):
    a = 3
    global message
    message += "fudousan"
    print(message + " " + str(a))
    return x + y

price = sum(a, b)
print(price)
print(message + " " + str(a))

# 【実行結果(例)】

fudousanfudousan 3
30
fudousanfudousan 10

スコープの実践(不動産投資家を再現

# 物件購入シーン

# 【入力内容】

import random

def attack(asset):
    print("投資家は" + asset + "を検討した。")
    value = random.randint(1, 10)
    if value < 6:
        print(asset + "を、" + str(value) + "億で購入した!")
    else:
        print("大当たり!" + asset + "は、その後大きく値上がりした!")

assets = ["マンション", "オフィス", "店舗"]
for asset in assets:
    attack(asset)

# 【実行結果(例)】

投資家はマンションを検討した。
大当たり!マンションは、その後大きく値上がりした!
投資家はオフィスを検討した。
大当たり!オフィスは、その後大きく値上がりした!
投資家は店舗を検討した。
店舗を、5億で購入した!

# 不動産購入、予算確認シーン

# 【入力内容】

def name(person):
    print(person + "は物件を購入した!")

def paying_money(badget):
    print("会社の予算は残り" + str(badget) + "百万円です")

badget = int(input())
team = {"担当者A" : 200, "担当者B" : 150, "担当者C" : 100}

for person, power in team.items():
    name(person)
    # 以下に、敵の体力を減少させるコードを書く
    badget -= power
    paying_money(badget)

# 【実行結果(例)】

担当者Aは物件を購入した!
会社の予算は残り530百万円です
担当者Bは物件を購入した!
会社の予算は残り380百万円です
担当者Cは物件を購入した!
会社の予算は残り280百万円です

引数のデフォルト値(投資家の属性分類など

# 引数のデフォルト値

# 【入力内容】

def introduce(name = "マンション投資家"):
    print("私は" + name + "です。")

introduce("アパート投資家")
introduce()

# 【実行結果(例)】

私はアパート投資家です。
私はマンション投資家です。

# 可変長引数

# 【入力内容】

def introduce(greeting, *names):
    for name in names:
        print("私は" + name + "です。" + greeting)

introduce("こんにちは", "投資家A", "投資家B", "投資家C")

# 【実行結果(例)】

私は投資家Aです。こんにちは
私は投資家Bです。こんにちは
私は投資家Cです。こんにちは

# 可変長引数 - 辞書

# 【入力内容】

def introduce(**people):
    for name, greeting in people.items():
        print("私は" + name + "です。" + greeting)

introduce(投資家A = "マンション買います", 投資家B = "アパート買います", 投資家C = "ビル買います")

# 【実行結果(例)】

私は投資家Aです。マンション買います
私は投資家Bです。アパート買います
私は投資家Cです。ビル買います

キーワード引数(投資家の属性分類など

# キーワード引数

# 【入力内容】

def asset_hello(greeting = "こんにちは!", target = "不動産"):
    print(greeting + " " + target)

asset_hello()
asset_hello("見つけた!", "良い物件")
asset_hello("おはよう!")
asset_hello(greeting = "おはよう!", target = "良い物件")
asset_hello(target = "掘り出し物件", greeting = "こんばんは!")
asset_hello(target = "掘り出し物件")
asset_hello(greeting = "こんばんは!")

# 【実行結果(例)】

こんにちは! 不動産
見つけた! 良い物件
おはよう! 不動産
おはよう! 良い物件
こんばんは! 掘り出し物件
こんにちは! 掘り出し物件
こんばんは! 不動産

Python入門8: クラス1

クラスとは?(投資家や投資物件の分類など

オブジェクトとは?

  • 変数と関数をセットにしたもの
    例)変数 name = “fudousan”、関数 “購入する”
  • オブジェクトにまとめられている関数→メソッド

クラスからオブジェクトを使って利用

  • クラス:オブジェクトの設計図
  • オブジェクト:クラスから生成する

オブジェクトのメリット

  • 変数とメソッドがセット
    バグが出にくい
  • クラスとオブジェクトに分離
    再利用しやすい
    分類しやすい

クラス作成(投資家と投資物件の分類など

# クラスを作成する

# 【入力内容】

class Investor:
    def invest(self):
        print("投資家は、不動産に投資した!")
    
    def asset(self, asset_type):
        print("投資家は" + asset_type + "を購入した")

investor1 = Investor()
investor1.invest()
investor1.asset("ボロ戸建て")

# 【実行結果(例)】

投資家は、不動産に投資した!
投資家はボロ戸建てを購入した

変数でクラス管理(投資家分類など

インスタンス変数は、インスタンスが持つ変数のこと。
インスタンス変数は、インスタンスがある限りデータが保持される。

# 変数をクラスで管理する

# 【入力内容】

class Investor:
    def __init__(self, job):
        self.job = job

    def buy(self):
        print(self.job + "は物件を購入していた")

investor1 = Investor("投資家A")
investor1.buy()

# 【実行結果(例)】

投資家Aは物件を購入していた

オブジェクトの具体例(投資家分類など

# 投資家クラスを作る

# 【入力内容】

class Investor:
    def __init__(self, name):
        self.name = name
        
    def buy(self):
        print(self.name + "は物件を購入した!")

investors = []
investors.append(Investor("投資家A"))
investors.append(Investor("投資家B"))
investors.append(Investor("投資家C"))

for investor in investors:
    investor.buy()

# 【実行結果(例)】

投資家Aは物件を購入した!
投資家Bは物件を購入した!
投資家Cは物件を購入した!

引数と戻り値のあるメソッド(購入金額を計算など

# クラスで、引数と戻り値のあるメソッドを作る

# 【入力内容】

class Item:
    tax = 1.10
    
    def __init__(self, price, quantity):
        self.price = price
        self.quantity = quantity
    
    def total(self):
        return int(self.price * self.quantity * Item.tax)

building1 = Item(3, 8)
total = building1.total()
print("合計金額は" + str(total) + "億円です")

building2 = Item(2, 20)
print("合計金額は" + str(building2.total()) + "億円です")

# 【実行結果(例)】

合計金額は26億円です
合計金額は44億円です

文字列とリストのメソッド(アセットをリスト化など

# 文字列とリストのメソッドを使ってみよう

# 【入力内容】

text = "fuDousan"
print(text)
print(text.capitalize())
print(text.upper())

players = "レジ,店舗,オフィス,ホテル"
list = players.split(",")
list.remove("店舗")
print(list)
list.append("物流")
print(list)

# 【実行結果(例)】

fuDousan
Fudousan
FUDOUSAN
['レジ', 'オフィス', 'ホテル']
['レジ', 'オフィス', 'ホテル', '物流']

# 文字列に対してメソッドを実行する

# 【入力内容】

# 標準入力を"fudousan"として

msg = input()
if msg.islower():
    print("True")
else:
    print("False")

# 【実行結果(例)】

True

# リストに対してメソッドを実行する

# 【入力内容】

team = ["レジ", "店舗", "オフィス", "物流"]
team.(team)insert(3, "ホテル")
print

# 【実行結果(例)】

['レジ', '店舗', 'オフィス', 'ホテル', '物流']

アクセス制限(投資家・アセット分類など

# アクセス制限を理解する

# 【入力内容】

class Investor:
    def __init__(self, name, method):
        self.name = name
        self.__method = method

    def invest(self):
        print(self.name + "は物件を探していた")
        self.__buy("区分マンション")

    def __buy(self, asset):
        print(self.__method + "で" + asset + "に投資")

investor1 = Investor("投資家A", "フルローン")
investor1.invest()
# investor1.__buy("区分マンション")
# print(investor1.__method)

# 【実行結果(例)】

投資家Aは物件を探していた
フルローンで区分マンションに投資

# 【入力内容】

class Greeting:
    def __init__(self, name):
        self.__name = name

    def say_hello(self):
        print("hello " + self.__name)

asset = Greeting("fudousan")
asset.say_hello()

# 【実行結果(例)】

hello fudousan

Python入門9: クラス2

クラスの続き(投資家・アセット分類など

オブジェクト

  • 変数とメソッドがセット
  • クラス(設計図)からオブジェクトを作る
  • クラスを引き継いで、新しいクラスを定義可

クラス承継(投資家・アセット分類など

# クラスにメソッドを定義

# 【入力内容】

class Box:
    def __init__(self, asset):
        self.asset = asset
    
    def open(self):
        print("優良物件を見つけた!" + self.asset + "を購入した!")

class AssetsBox(Box):
    def look(self):
        print("対象物件はあっという間に売れそう。")

box = Box("アパート")
box.open()

assetbox = AssetsBox("店舗")
assetbox.look()
assetbox.open()

# 【実行結果(例)】

優良物件を見つけた!アパートを購入した!
対象物件はあっという間に売れそう。
優良物件を見つけた!店舗を購入した!

# 【入力内容】

class Greeting:
    def __init__(self):
        self.msg = "hello"
        self.target = "Fudousan"

class Hello(Greeting):
    # この下に、say_helloメソッドを記述する
    def look(self):
        print(self.msg + " " + self.target)

player = Hello()
player.look()

# 【実行結果(例)】

Hello Fudousan

メソッドのオーバーライド(投資家・アセット分類など

# 【入力内容】

class Box:
    def __init__(self, asset):
        self.asset = asset

    def open(self):
        print("優良物件を見つけた!" + self.asset + "を購入した!")

class AssetBox(Box):
    def look(self):
        print("対象物件はあっという間に売れそう。。")
    
    def open(self):
        print("優良物件を見つけた!" + self.asset + "を買い損ねた。。")

box = Box("アパート")
box.open()

magicbox = AssetBox("店舗")
magicbox.look()
magicbox.open()

# 【実行結果(例)】

優良物件を見つけた!アパートを購入した!
対象物件はあっという間に売れそう。。
優良物件を見つけた!店舗を買い損ねた。。

# 【入力内容】

class Greeting:
    def __init__(self):
        self.msg = "Hello"
        self.target = "Fudousan"

    def say_hello(self):
        print(self.msg + " " + self.target)

class Hello(Greeting):
    # ここにオーバライドするメソッドを記述する
    def say_hello(self, target):
        print(self.msg + " " + target)

player = Hello()
player.say_hello("不動産")

# 【実行結果(例)】

Hello 不動産

クラスを承継(各投資家の動きを確認

# 【入力内容】

class Investor:
    def __init__(self, name):
        self.name = name

    def invest(self, asset):
        print(self.name + "は、" + asset + "を購入した!")

class Investor_2(Investor):
    def invest(self, asset):
        print("なんと!!")
        print(self.name + "は、" + asset + "を売却した!")

print("=== 各投資家の動き ===")
investor1 = Investor("投資家A")
investor2 = Investor("投資家B")
investor3 = Investor_2("投資家C")

party = [investor1, investor2, investor3]
for member in party:
    member.invest("マンション")

# 【実行結果(例)】

=== 各投資家の動き ===
投資家Aは、マンションを購入した!
投資家Bは、マンションを購入した!
なんと!!
投資家Cは、マンションを売却した!

クラスからメソッドを呼び出し(各投資家の動きを確認

ネームマングリング:内部的にメソッド名や変数名が変更され、外部からもクラス内部を読み取れる仕組み。

# 【入力内容】

class Investor:
    def __init__(self, name):
        self.name = name

    def invest(self, asset):
        print(self.name + "は、" + asset + "を購入した!")

class Investor_2(Investor):
    def __init__(self):
        super().__init__("投資家C")
    def invest(self, asset):
        self.__spell()
        print(self.name + "は、" + asset + "を売却した!")
    
    def __spell(self):
        print("なんと!!")

print("=== 各投資家の動き ===")
investor1 = Investor("投資家A")
investor2 = Investor("投資家B")
investor3 = Investor_2()

party = [investor1, investor2, investor3]
for member in party:
    member.invest("マンション")

investor3._Investor_2__spell()

# 【実行結果(例)】

=== 各投資家の動き ===
投資家Aは、マンションを購入した!
投資家Bは、マンションを購入した!
なんと!!
投資家Cは、マンションを売却した!
なんと!!

クラス変数とクラスメソッド(各投資家の動きを確認

# 【入力内容】

class Investor:
    __investor_count = 0
    
    @classmethod
    def summary(cls):
        print(str(Investor.__investor_count) + "人が物件を購入した!")
    
    def __init__(self, name):
        self.name = name
        Investor.__investor_count += 1
        print(str(Investor.__investor_count) + "番目の投資家、" + self.name + "が登場した。" )

    def invest(self, asset):
        print(self.name + "は、" + asset + "を購入した!")

class Investor_2(Investor):
    def __init__(self):
        super().__init__("投資家C")
    
    def invest(self, asset):
        self.__spell()
        print(self.name + "は、" + asset + "を売却した!")
    
    def __spell(self):
        print("なんと!!")

print("=== 各投資家の動き ===")
investor1 = Investor("投資家A")
investor2 = Investor("投資家B")
investor3 = Investor_2()

party = [investor1, investor2, investor3]
for member in party:
    member.invest("マンション")

Investor.summary()

# 【実行結果(例)】

=== 各投資家の動き ===
1番目の投資家、投資家Aが登場した。
2番目の投資家、投資家Bが登場した。
3番目の投資家、投資家Cが登場した。
投資家Aは、マンションを購入した!
投資家Bは、マンションを購入した!
なんと!!
投資家Cは、マンションを売却した!
3人が物件を購入した!

# 【入力内容】

# クラスメソッドを呼び出そう

class Greeting:
    @classmethod
    def say_hello(cls):
        print("Hello Fudousan")

# この下で、クラスメソッドを呼び出す
Greeting.say_hello()

# 【実行結果(例)】

Hello Fudousan

標準ライブラリ読み込み(契約日時を表示など

# 【入力内容】

from datetime import datetime, timedelta, timezone

jst = timezone(timedelta(hours=9))
today = datetime.now(jst)
print(today)
print(today.year)
print(today.month)
print(today.day)

day = datetime.strptime("2025/01/20 06:02:19", "%Y/%m/%d %H:%M:%S")
print(day)

# 【実行結果(例)】

2021-04-05 21:20:51.695272+09:00
2021
4
5
2025-01-20 06:02:19

Python入門10: 例外処理

例外処理の概要(データ分析エラー処理

例外処理

  • 実行時に発生する問題に対応

例外発生例

  • ゼロで割り算
  • 数値変換で、数字でない文字を指定
  • 配列の範囲外にアクセス
  • ファイルが存在しない
  • 引数が不正

メリット

  • プログラムを安定して稼働させる
  • システムの品質を高める
  • エラーメッセージも読み取れる

例外処理(Exception)の機能

  1. try:予めコードを指定して、プログラム実行時に処理の問題を検出
  2. except:問題を検出したとき、どのように対応するのか記述
  3. raise:対応を記述していない場合、メソッドの呼び出し元に対応を任せる

簡単な例外処理(データ分析エラー処理

# 【入力内容】

print(1)
try:
    number = 0
    answer = 100 / number
    print(answer)
except ZeroDivisionError as e:
    print(e)
finally:
    print(2)

# 【実行結果(例)】

1
division by zero
2

様々な形式での例外処理(データ分析エラー処理

# 【入力内容】

import traceback, sys

print(1)
try:
    number = 0
    answer = 100 / number
    print(answer)
except ZeroDivisionError as e:
    print("0では割り算できません")
    # print(traceback.format_exc())
    sys.stderr.write(traceback.format_exc())
finally:
    print(2)

# 【実行結果(例)】

1
0では割り算できません
2

# 【実行時エラー】

Traceback (most recent call last):
  File "Main.py", line 9, in 
    answer = 100 / number
ZeroDivisionError: division by zero

# 【入力内容】

import traceback, sys

assets = ["マンション", "アパート", "戸建て"]

try:
    number = 0
    print("投資家はレジ物件を探している")
    print("投資家は" + assets + "を見つけた")
except ZeroDivisionError as e:
    sys.stderr.write("そのアセットは表示できません")
    
finally:
    print("投資家は物件を購入した")

# 【実行結果(例)】

投資家はレジ物件を探している
投資家は物件を購入した

# 【実行時エラー】

そのアセットは表示できません

発生させる例外変更(データ分析エラー処理

  1. スーパークラス
  • Exception:全てのErrorを包括する
  1. サブクラス
  • ZeroDivisionError
    ゼロ入力すべきではないところに、ゼロが入力された時
  • NameError
    未定義のローカル変数や定数を利用した時
  • TypeError
    期待と異なる型が渡された時
    # 【入力内容】
    
    print(1)
    try:
        number = 1
        answer = 100 / number
        print(answer2)
    except NameError as e:
        print("未定義の変数を呼び出しています")
        print(e)
    finally:
        print(2)
    
    # 【実行結果(例)】
    
    1
    未定義の変数を呼び出しています
    name 'answer2' is not defined
    2
    

    複数の例外補足(データ分析エラー処理

    # 【入力内容】
    
    print(1)
    try:
        number = "A"
        answer = 100 / number
        print(answer2)
    except ZeroDivisionError as e:
        print("0では割り算できません")
        print(e)
    except NameError as e:
        print("未定義の変数を呼び出しています")
        print(e)
    except Exception as e:
        print("予期せぬエラーが発生しました")
        print(e)
    finally:
        print(2)
    
    # 【実行結果(例)】
    
    1
    予期せぬエラーが発生しました
    unsupported operand type(s) for /: 'int' and 'str'
    2
    

    raiseで意図的に例外を投げる(データ分析エラー処理

    # 【入力内容】
    
    print(1)
    try:
        print(2)
        raise Exception("意図的な例外")
        print(3)
    except Exception as e:
        print("予期せぬエラーが発生しました")
        print(e)
    finally:
        print(4)
    
    # 【実行結果(例)】
    
    1
    2
    予期せぬエラーが発生しました
    意図的な例外
    4
    
    # 【入力内容】
    
    import sys
    
    print("Hello World")
    
    try:
        raise ZeroDivisionError("強制エラー")
    except NameError as e:
        sys.stderr.write("未定義の変数を呼び出しています")
    except ZeroDivisionError as e:
        sys.stderr.write("0では割り算はできません")
    finally:
        print("Hello Python3")
    
    # 【実行結果(例)】
    
    Hello World
    Hello Python3
    
    # 【実行時エラー】
    
    0では割り算はできません
    

    例外は伝わる(データ分析エラー処理

    # 【入力内容】
    
    def test_exception(number):
        print(2)
        try:
            print(3)
            answer = 100 / number
            return answer
            print(4)
        except ZeroDivisionError as e:
            print(5)
            raise e
        print(6)
    
    print(1)
    try:
        answer = test_exception(1)
        print(7)
    except ZeroDivisionError as e:
        print(8)
        print(e)
    
    # 【実行結果(例)】
    
    1
    2
    3
    7
    
    # 【入力内容】
    
    import sys
    
    def calc():
        return 100 / 0
    
    try:
        print(calc())
    except ZeroDivisionError as e:
        sys.stderr.write("0で割り算はできません")
    
    # 【実行時エラー】
    
    0で割り算はできません
    

    finally理解(データ分析エラー処理

    # 【入力内容】
    
    def test_exception(number):
        print(2)
        try:
            print(3)
            answer = 100 / number
            return answer
            print(4)
        except ZeroDivisionError as e:
            print(5)
            raise e
        finally:
            print(6)
    
    print(1)
    try:
        answer = test_exception(0)
        print(7)
    except ZeroDivisionError as e:
        print(8)
        print(e)
    
    # 【実行結果(例)】
    
    1
    2
    3
    5
    6
    8
    division by zero
    

    以上になります。
    いかがでしたでしょうか?

    今回のまとめ

    不動産ビッグデータ分析に必要なPythonコード基礎知識
    Part1:Pythonの基礎
    Part2:条件分岐・比較演算子の基礎
    Part3:ループ処理の基礎
    Part4:リストの基礎
    Part5:辞書(ディクショナリ)の基礎
    Part6:多次元リストの理解
    Part7:関数
    Part8:クラス1
    Part9:クラス2
    Part10:例外処理

    不動産データ分析にご興味ある方にとって、少しでも役に立てるような内容でしたら幸いです。

    不動産投資にご興味がある方向け

    多数の不動産投資サービス会社の中から、私自身の長年の業界経験を踏まえ、
    特に信頼・おススメできる2社のみ厳選(現物投資と少額投資1社ずつ)。

    ライフプラン診断LP

    不動産現物投資おススメNo1
    東証マザーズ上場企業GA Technologies運営のライフプラン診断。
    購入可能上限額・おススメの運用例・老後の資産保有イメージが分かります。
    今だけ、無料の投資ニーズ相談でAmazonギフト券3万円分がもらえます
    不動産投資も学べるアマギフ3万円で、まさに一石二鳥

    OwnersBook不動産少額投資おススメNo1
    東証マザーズ上場企業ロードスターキャピタル運営の不動産クラウドファンディング「Ownersbook」。少額投資から不動産投資をスタートできます。
    ほとんど利息が付かない銀行預金よりも、一部を不動産クラウドファンディングに分散してみることをおススメします
    不動産業界の長い私から見ても、同社の担当者は不動産のプロ中のプロです。