本セミナーは、Python初級者が次の3つをマスターできることを目標としています。
これら3つのステップは、装置や計測方法が異なっていても、共通して行うデータ処理の流れですよね。Excelによるデータ処理でも、普段から行っている作業です。
では、Pythonではどのように進めるのでしょうか?本セミナーは、この作業の流れを習得することを目的したカリキュラムです。
またARIM事業では、各機器ごとにデータ構造化コードを作成していますが、実は、この3つのステップを組み入れたコードを各機器ごとに、その機器での利用形態や今後のデータ利活用にあわせて作っています。
本セミナーの内容を習得すると、例として次のようなプログラムを作成・実行することができるようになります。
まずは、実際にプログラムを動かしてみましょう。
まだプログラムの具体的な内容を理解する必要はありません。このような短いプログラムを記述するだけで、データの加工やグラフ出力ができる、というイメージをつかんでいただければ十分です。
以下に、プログラムの「ソースコード」が記述されています。ソースコードとは、プログラムで行いたい処理をプログラミング言語(今回はPython)で記述したものです。
プログラムを実行するには、ソースコードの任意の場所をクリックした後、次のどちらかの操作を行います。
# ソースコード
# スペクトルデータのグラフを作成
#---------------------------------------
import pandas as pd
import matplotlib.pyplot as plt
# CSVファイルからデータを読み込み
# Google Colaboratoryではオンラインのファイルを読み込むが
# 通常はローカルドライブのファイルを読み込む
df = pd.read_csv("https://raw.githubusercontent.com/tendo-sms/python_beginner_2023/main/files_1/sample_1_01.csv")
# 欠損値を含む行を削除
df = df.dropna()
# 折れ線グラフをプロット
x = df['Wavelength']
y = df['Intensity']
plt.plot(x, y)
# グラフタイトル・軸ラベルの設定
plt.title("Spectrum")
plt.xlabel("Wavelength")
plt.ylabel("Intensity")
# 完成したグラフを画面に描画
plt.show()
最初にプログラムを実行するときは、少し時間がかかることがあります。しばらく待つと、プログラムが実行された結果、グラフが表示されます。
Pythonのプログラムは、次の流れで実行します。
ここでは、代表的なPython実行環境とエディタをご紹介します。
代表的なPythonの実行環境として、公式版PythonとAnacondaがあります。
Pythonプログラムのソースコードを作成するための、代表的なエディタについてご紹介します。
【小ネタ】Jupyterの「py」は、Pythonの頭文字です。そのため、Jupyterの正しい読み方は「ジュパイター」だという意見もあります。しかし現実には、ほとんどの人が「ジュピター」と呼んでいるのが実態です。
本セミナーでは、Google Colaboratoryを使用しています。
以下のソースコードは、画面に"Hello, world."という文字列と、整数値の10を出力するプログラムです。
それでは実際に、プログラムを動かしてみましょう。
print("Hello, world.")
print(10)
Hello, world. 10
【小ネタ】Pythonに限らず様々なプログラミング言語の入門書において、一番最初に学ぶプログラムが「画面に"Hello, world."と表示する。」であることが多いです。ある意味、最も有名なソースコードと言えるかもしれません。
次のソースコードで、AAAやaaaは「変数」と呼ばれるものです。変数は、文字列や数値などの値を格納する入れ物のようなものです。
それでは実際に、プログラムを動かしてみましょう。
AAA = "Hello, world."
aaa = 10
print(AAA)
print(aaa)
Hello, world. 10
様々な変数名の例を、次に示します。
Hello_World = "Hello, world."
number10 = 10
_valueX = 123
print(Hello_World)
print(number10)
print(_valueX)
Hello, world. 10 123
次のソースコードは、"Hello world."という文字列の長さを出力するプログラムです。
それでは、実際にプログラムを動かしてみましょう。
str_len = len("Hello, world.")
print(str_len)
11
プログラムには、コメントを記述することができます。コメントはプログラムを読みやすくするための記述であり、プログラムの動作には何の影響も与えません。
# 変数に文字列を格納する
AAA = "Hello, world."
# 変数に数値を格納する
aaa = 10
# 変数の値を画面に出力する
# 変数名の大文字と小文字は区別されることに注意する
print(AAA)
print(aaa)
Hello, world. 10
プログラムを見た人が内容を理解しやすいよう、積極的にコメントを書くことを心がけましょう。
コメントには、#で開始するコメントのほかに、docstring(ドックストリング)というコメントも存在します。以下のソースコードは、docstringによるコメントを記述した例です。
def remainder(v1, v2):
"""割り算の余りを求める関数です
Args:
v1 (int, float): 数値
v2 (int, float): 数値
Returns:
rem (int, float): 余り
"""
rem = v1 % v2
return rem
【小ネタ】docstringは単にソースコードを読みやすくするだけではありません。docstringを書いておくと、help機能で自作関数の仕様を確認することができるのです!
help(remainder)
Pythonで扱うデータには、データの種類を示す「型(type)」という概念があります。
【ワンポイント】「型」の判別は、データ構造化の作業では大変に重要な作業となります。例えば、「2」という数字があった場合を考えます。これはプログラムで認識させるときに「文字」としての"2"であるのか、整数としての"2"であるのか、あるいは浮動小数点数としての"2.0"として処理をするのがよいか。それぞれによって、プログラムの内容も変わります。それを、Pythonに限らず各種のプログラミング言語においては「型」で判別をします。
"(ダブルクォート)または'(シングルクォート)で囲まれた値は、文字列となります。
次のプログラムを実行して、データの型を確認しましょう。「type関数」は、指定したデータの型が何であるかを取得します。
# 文字列型の値を変数に格納する
str_value = "Hello, world."
# データの型を取得する
type(str_value)
str
「docstringによるコメント」でご紹介したように、"""(ダブルクォート3つ)、または'''(シングルクォート3つ)で囲むと、文字列に改行などの特殊な文字をそのまま記述できます。
# 文字列型の値を変数に格納する
str_value = """Hello, world.
Hello, python"""
# 改行を含む文字列を出力する
print(str_value)
# データの型を取得する
type(str_value)
Hello, world. Hello, python
str
【注意事項 (とても重要!)】
上記のプログラムを実行すると、type関数の結果として「str」が画面に出力されました。実は、このようにtype関数の結果が画面に出力されるのは、Jupyter NotebookやGoogle Colaboratoryの独自機能によるものです。本来、type関数には画面に結果を出力する機能はありません。
type関数だけでなく、Jupyter NotebookやGoogle Colaboratoryでは、print関数を使わなくても計算結果などを画面に表示してくれることがあります。しかし、これはあくまでエディタの補助的な機能によるもので、本来はデータを画面に出力するときはprint関数を使用することを必ず覚えておいてください。本来、type関数の結果を画面に出力するには、次のように記述します。
print(type(str_value))
以降の例では、print関数をきちんと使って、ソースコードを記述しています。
# 整数型の値を変数に格納する
int_value = 10
# データの型を取得する
print(type(int_value))
<class 'int'>
# 2進数
print(0b1011)
# 8進数
print(0o777)
# 16進数
print(0x1A)
11 511 26
【ワンポイント】では、ここで次のようしたらどうなるでしょうか?
int_value = "10"
print(type(int_value))
<class 'str'>
同じ半角の10であっても、"10"とダブルクォートで囲むことで、文字列となりましたね。
# 浮動小数点数型の値を変数に格納する
float_value = 3.14
# データの型を取得する
print(type(float_value))
<class 'float'>
bool_value = True
# データの型を取得する
print(type(bool_value))
<class 'bool'>
# 整数型の値を定義
int_value = 100
print(type(int_value))
# str関数を使って整数型の100を文字列型"100"に変換する
int_to_str = str(int_value)
print(type(int_to_str))
<class 'int'> <class 'str'>
次のソースコードでは、「int関数」を使って文字列型の値を整数型に変換しています。
# 文字列型の値を定義
str_value = "999"
print(type(str_value))
# int関数を使って文字列型の"999"を整数型999に変換する
str_to_int = int(str_value)
print(type(str_to_int))
<class 'str'> <class 'int'>
str関数およびint関数以外にも、それぞれのデータ型に対応した変換用の関数が用意されています。
次に、複数の値からなるデータ型として、次の表に示すデータ型を紹介します。
データ型 | Pythonプログラムでの表現 |
---|---|
リスト | list |
タプル | tuple |
辞書 | dict |
集合 | set |
このようなデータ型は、「コンテナ型」とも呼ばれます。
Pythonの入門書や、Python以前からあるプログラミング言語などでは、「配列」と呼ぶこともある内容で、データの格納方法を示す概念です。
この中でもリストと辞書はデータ構造化の中でも最も頻繁に使います。しっかりと理解をしましょう。
リストは、複数の値を順序付けられた一つのデータとして扱うことができます。
次のプログラムを実行して、データ内容と型を確認しましょう。
# リストを作成する 値が重複していてもよい
num_list = [1, 3, 5, 5, 7]
# リストの内容を画面に出力する
print(num_list)
# データの型を画面に出力する
print(type(num_list))
[1, 3, 5, 5, 7] <class 'list'>
リストの値は、上記の整数型だけでなく、任意のデータ型とすることができます。次のソースコードは、様々なデータ型の値を持つリストの例です。
# 文字列型のリスト
str_list = ["Tokyo", "Osaka", "Nagoya"]
print(str_list)
# リストのリスト(入れ子のリスト)
list_list = [[1, 3], [5, 5, 7]]
print(list_list)
# 複数のデータ型が混在したリスト
multi_list = [10, "Tokyo", True, [1, 3]]
print(multi_list)
['Tokyo', 'Osaka', 'Nagoya'] [[1, 3], [5, 5, 7]] [10, 'Tokyo', True, [1, 3]]
リストについては、「データ構造化の代表的なデータ操作方法」の講義でも詳しく説明します。
タプルはリストと似ていますが、次の点が異なります。それ以外は、リストと同様に使用することができます。
次のプログラムを実行して、データ内容と型を確認しましょう。
# タプルを作成する。値の重複を許可する
num_tuple = (0, 1, 2, 3, 4, 5, 6, 7)
num_tuple = (100, 1, 2, 3, 4, 5, 6, 7)
# タプルの内容を画面に出力する
print(num_tuple)
# データ型を確認する
print(type(num_tuple))
(100, 1, 2, 3, 4, 5, 6, 7) <class 'tuple'>
辞書はキー(key)と値(value)のペアを複数集めたデータです。
次のプログラムを実行して、データ内容と型を確認しましょう。
# 辞書を作成する
mydict = {"key1": "value1", "key2": "value2", "key3": "value3"}
# 辞書の内容を画面に出力する
print(mydict)
# データ型を確認する
print(type(mydict))
# キーや値には文字列以外のデータ型も使用できる
multi_mydict = {"key1": "value1", 2: 10, "key3": [1, 2, 3]}
print(multi_mydict)
{'key1': 'value1', 'key2': 'value2', 'key3': 'value3'} <class 'dict'> {'key1': 'value1', 2: 10, 'key3': [1, 2, 3]}
【小ネタ】計測にかかるメタデータの構造化では、この辞書型を必須として使っています。例えばSEMのメタデータではkey='倍率'、value=10000といったように格納します。様式2で選定したメタデータは、ここで活用されます。
辞書ついては、「データ構造化の代表的なデータ操作方法」の講義でも詳しく説明します。
次のソースコードでは、タプルのところでご紹介したように、辞書のキーとしてタプルを使用しています。一方、辞書のキーとしてリストは使用できません。
# 辞書を作成する
mydict = {("key1-1", "key1-2"): "value1", ("key2-1", "key2-2"): "value2"}
# タプルの内容を画面に出力する
print(mydict)
{('key1-1', 'key1-2'): 'value1', ('key2-1', 'key2-2'): 'value2'}
集合は、値の集合を示すデータです。
次のプログラムを実行して、データ内容と型を確認しましょう。
# 集合を作成する
num_set = {1, 3, 5, 7}
# 集合の内容を画面に出力する
print(num_set)
# データ型を確認する
print(type(num_set))
{1, 3, 5, 7} <class 'set'>
次のソースコードは、3つの集合の積を求めています。
# 3つの集合を作成する
setA = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
setB = {2, 4, 6, 8, 10}
setC = {1, 2, 4, 8}
# 積集合を求める
setP = setA & setB & setC
# 求めた積集合を画面に出力する
print(setP)
{8, 2, 4}
次のソースコードのように、len関数に複数の値からなるデータ型のデータを指定すると、データに含まれる値の数を取得することができます。
# 値の数が5個のリストの長さを取得
str_list = ["Tokyo", "Osaka", "Nagoya", "Fukuoka", "Hokkaido"]
len_str_list = len(str_list)
print(len_str_list)
# 値の数が4個の辞書の長さを取得
int_dict = {"key1": 1, "key2": 2, "key3": 3, "key4": 4}
len_int_dict = len(int_dict)
print(len_int_dict)
# 値の数が3個のタプルの長さを取得
int_tuple = (10, 20, 30)
len_int_tuple = len(int_tuple)
print(len_int_tuple)
# 値の数が2個の集合の長さを取得
int_set = {100, 200}
len_int_set = len(int_set)
print(len_int_set)
5 4 3 2
なお、リスト、タプル、辞書、および集合は、要素の数を0とすることもできます。この場合、len関数の結果も0となります。
データ型 | 要素0のとき |
---|---|
リスト | [] |
タプル | () |
辞書 | {} |
集合 | set() ※{}とすると辞書になってしまうので注意してください |
最初に要素の数を0としておいて、プログラムの中で要素を次々と増やしていく、といった使い方があります。
# 値の数が0個のリストの長さを取得
str_list = []
len_str_list = len(str_list)
print(len_str_list)
# 値の数が0個の辞書の長さを取得
int_dict = {}
len_int_dict = len(int_dict)
print(len_int_dict)
# 値の数が0個のタプルの長さを取得
int_tuple = ()
len_int_tuple = len(int_tuple)
print(len_int_tuple)
# 値の数が0個の集合の長さを取得
# {}とすると辞書になってしまうのでset()と記述する
int_set = set()
len_int_set = len(int_set)
print(len_int_set)
0 0 0 0
次のソースコードでは、リストに含まれる値のうち、任意の一つの値を取得しています。
# リストを作成
# 0番目が"Tokyo"、1番目が"Osaka"、2番目が"Nagoya"となる点に注意
str_list = ["Tokyo", "Osaka", "Nagoya"]
# 2番目の要素を取得する
print(str_list[1])
# 後ろから2番目の要素を取得する
# -3番目が"Tokyo"、-2番目が"Osaka"、-1番目が"Nagoya"となる
print(str_list[-2])
Osaka Osaka
タプルについても、リストと同じように値を取得できます。
# タプルを作成
str_tuple = ("Tokyo", "Osaka", "Nagoya")
# 2番目の要素を取得する
print(str_tuple[1])
# 後ろから2番目の要素を取得する
print(str_tuple[-2])
Osaka Osaka
辞書には順序の考えがないため、このように順序指定により値を取得することはできません。
辞書については、次のいずれかの方法で任意の一つの値を取得できます。
# 辞書を作成する
str_dict = {"key1": "value1", "key2": "value2", "key3": "value3"}
# キー"key2"に対応する値を取得する
# 存在しないキーを指定するとプログラムがエラーとなる
print(str_dict["key2"])
# get(キー)では存在しないキーを指定するとNoneとなる
print(str_dict.get("key2"))
print(str_dict.get("keyX"))
# get(キー, デフォルト値)では存在しないキーを指定するとデフォルト値となる
print(str_dict.get("key2", "default_value"))
print(str_dict.get("keyX", "default_value"))
None None None None default_value
なお、値がNoneであるペアを含む辞書に対して辞書名.get(キー)とした結果、Noneであった場合、値のNoneを取得したのか、存在しないキーを指定したのか、区別することができません。そのような可能性がある場合は、辞書名.get(キー, デフォルト値)の方法を使用してください。また、「Pythonの基礎2」の講義でご紹介するif制御文を用いると、指定したキーが辞書の中に含まれるかを、事前にチェックすることができます。
次のソースコードは、リストのうち一部の要素を切り出した別のリストを取得しています。このような操作を「スライス」と呼びます。
# リストを作成
num_list = [0, 1, 2, 3, 4, 5, 6, 7]
# リストの3番目から5番目までの値を取得
# 5番目までの値を取得する場合は、終了点を6とする必要がある点に注意
print(num_list[3:6])
# リストの4番目から最後までの値を取得
print(num_list[4:])
# リストの最初から6番目までの値を取得
# 6番目までの値を取得する場合は、終了点を7とする必要がある点に注意
print(num_list[:7])
# リストの1番目から5番目までの値を2個おきに取得
# 5番目までの値を取得する場合は、終了点を6とする必要がある点に注意
print(num_list[1:6:2])
[3, 4, 5] [4, 5, 6, 7] [0, 1, 2, 3, 4, 5, 6] [1, 3, 5]
タプルについても、リストと同じようにスライスを使用できます。
# タプルを作成
num_tuple = (0, 1, 2, 3, 4, 5, 6, 7)
# タプルの3番目から5番目までの値を取得
print(num_tuple[3:6])
# タプルの4番目から最後までの値を取得
print(num_tuple[4:])
# タプルの最初から6番目までの値を取得
print(num_tuple[:7])
# タプルの1番目から5番目までの値を2個おきに取得
print(num_tuple[1:6:2])
(3, 4, 5) (4, 5, 6, 7) (0, 1, 2, 3, 4, 5, 6) (1, 3, 5)
なお、集合については要素を選ぶ機能はありません。
Pythonでは、数値の四則演算をはじめとして、様々な演算子が用意されています。ここでは、よく使用する代表的な演算子を紹介します。
算術演算子として、次の演算子を使用できます。
演算子 | 機能 |
---|---|
x + y | 加算 |
x - y | 減算 |
x * y | 乗算 |
x / y | 除算 |
x % y | xをyで割った余り |
x ** y | xのy乗 |
x // y | 切り捨て除算 |
なお、()による計算順序の指定もできます。
次のソースコードは、算術演算子を使用した計算プログラムの例です。
int_num = 10
# 5を加算
print(int_num + 5)
# 3で割った余り
print(int_num % 3)
# 2乗
print(int_num ** 2)
# ()を用いた計算順序の指定
print((int_num + 5) * 10)
15 1 100 150
整数型だけでなく、浮動小数点数型の計算にも使用できます。
float_num = 3.14
# 浮動小数点数の乗算
diameter = 1.5
print(diameter * float_num)
4.71
文字列演算子として、次の演算子を使用できます。
演算子 | 機能 |
---|---|
s + t | 文字列sと文字列tを連結 |
s * t | 文字列sをt回繰り返す |
次のソースコードは、文字列演算子を使用した計算プログラムの例です。
# 文字列の連結
print("abc" + "def")
# 文字列の繰り返し
print("abc" * 3)
abcdef abcabcabc
【小ネタ】文字の足し算は、ファイルの出力のときに多用しています。例: "sample"という名前のファイル名を".csv"を付けてsaveするときは、("sample"+".csv")とします。
代入演算子として、次の演算子を使用できます。
演算子 | 機能 |
---|---|
x = n | xにnを代入 |
x += n | x = x + nと同じ |
x -= n | x = x - nと同じ |
x *= n | x = x * nと同じ |
x /= n | x = x / nと同じ |
x %= n | x = x % nと同じ |
x **= n | x = x ** nと同じ |
x //= n | x = x // nと同じ |
次のソースコードは、代入演算子を使用した計算プログラムの例です。
# =で代入
x = 5
print(x)
# +=で代入
# x = x + 10と同じ動作
x += 10
print(x)
5 15
比較演算子として、次の演算子を使用できます。
演算子 | 機能 |
---|---|
x == y | xがyと等しい(=が2つであることに注意) |
x != y | xがyと異なる |
x < y | xがyよりも小さい |
x > y | xがyよりも大きい |
x <= y | xがy以下である |
x >= y | xがy以上である |
比較演算子は、比較結果が成り立つときに論理値のTrue、成り立たないときに論理値のFalseとなります。
次のソースコードは、比較演算子による比較結果がTrueとなるかFalseとなるかを確認しています。
num_value = 10
# 比較結果が成り立つ例
print(num_value == 10)
# 比較結果が成り立たない例
print(num_value != 10)
True False
なお、==および!=と似ている比較演算子として、次の比較演算子もあります。
演算子 | 機能 |
---|---|
x is y | xがyと等しい |
x is not y | xがyと異なる |
これらの演算子は、==および!=と厳密には同じではありません。次のソースコードを実行してみましょう。
# 内容が同じ2つのリストを作成
list1 = [1, 2, 3]
list2 = [1, 2, 3]
# ==とisそれぞれを用いて比較
print(list1 == list2)
print(list1 is list2)
True False
比較演算子として、次のような演算子も使用できます。
演算子 | 機能 |
---|---|
x in y | xがyに含まれる |
x not in y | xがyに含まれない |
使用例として、次のソースコードのように、リスト中にある値が含まれるかどうかを判定できます。
list1 = [1, 2, 3]
# list1の値に2が含まれるか
print(2 in list1)
# list1の値に5が含まれるか
print(5 in list1)
# list1の値に2が含まれないか
print(2 not in list1)
# list1の値に5が含まれないか
print(5 not in list1)
True False False True
inおよびnot inは、文字列の操作にも使用できます。詳細は、「Pythonの基礎2」の講義で「文字列の操作」としてご紹介します。
また、比較演算子のより具体的な使用例は、同じく「Pythonの基礎2」の講義で「代表的な制御構文」としてご説明します。
ブール演算子として、次の演算子を使用できます。
演算子 | 機能 |
---|---|
x and y | xもyもTrueであればTrue |
x or y | xまたはyがTrueであればTrue |
not x | xがFalseであればTrue |
ブール演算子は、比較演算子と組み合わせて複雑な条件比較を行うことなどに使用します。次のソースコードは、比較演算子とブール演算子を組み合わせて、結果がTrueとなるかFalseとなるかを確認しています。
num_value = 10
str_value = "abc"
# 比較結果が成り立つ例
print(num_value == 10 and str_value == "abc")
print(not num_value == 20)
# 比較結果が成り立たない例
print(num_value != 10 and str_value == "abc")
print(num_value == 20 or str_value == "def")
True True False False
今回の講義は、ここまでとなります。次回はPythonの基礎の後編として、次の内容をご紹介します。