AIって結局何なのかよく分からないので、とりあえず100日間勉強してみた Day3
経緯についてはこちらをご参照ください。
■本日の進捗
●Pandas User Guideを勉強
■Pandasとは何か
昨晩のNumPyに続き、Pandasについて学んでいきたいと思います。
”pandasは、データを変換したり解析したりするためのライブラリだ。このライブラリは、RのDataFrameを模して作られた、DataFrameというデータ構造を中心に構成されている。”
Andreas C. Muller, Sarah Guido. Pythonではじめる機械学習. 中田 秀基 訳. オライリー・ジャパン. 2017. 392p.
なお、著者は「Pythonによるデータ分析入門」(オライリー・ジャパン)を勧めているが、この世は無料で学べる素晴らしいコンテンツが一生かけても学び切れない程に揃っているので、今回も我流でPandas User Guideから学んでいきたいと思います。(すみません、言い訳です。追加で600ページの本を勉強する体力がないだけです…)
■Pandasの何がいいのか
Pandas は、データ操作や分析を効率的に行うために設計されたPythonライブラリで、1次元と2次元のデータ構造を扱うことができる。フィルタリングやグループ化、集計、欠損処理など基本的な機能を備えている他、SQL(よく知らないんですが、その手の界隈ではかなり有名で人気の言語らしいです。)を含む多彩なフォーマットに対応している。なおかつNumPyの時と同様に、その処理の多くがC言語ベースで実装されているため、大規模データを高速に処理ができる。Pythonのループより高速なベクトル化演算にも対応しているので、データを効率的に処理できる。
■10 minutes to pandas
Pandas User Guide には早速こう記述がある。
Users brand-new to pandas should start with 10 minutes to pandas.
For a high level summary of the pandas fundamentals, see Intro to data structures and Essential basic functionality.
ブランニューなユーザーは「10 minutes to pandas」から始めたら良いんじゃん?
「Intro to data structures」と「Essential basic functionality」もよくまとまってるから見てみたら?
自分は明らかにブランニューなユーザー(まだユーザーですらないですが…)なので「10 minutes to pandas」から取り組んでいこうと思います。ちなみに後者の2つはざっと見た感じかなりボリュームがありそうなので今すぐ手をつけるかは悩み中です。だって早くscikit-learnに行きたいんだもん…
まあ、後々隙間時間に読み進めていきます。
前準備、データ入れてるだけです。
>>> import pandas as pd
>>> s = pd.Series([1, 3, 5, np.nan, 6, 8])
>>> dates = pd.date_range("20130101", periods=6)
>>> dates
DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',
'2013-01-05', '2013-01-06'],
dtype='datetime64[ns]', freq='D')
>>> df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list("ABCD"))
>>> df
A B C D
2013-01-01 0.374369 0.989339 -1.755549 -0.418254
2013-01-02 0.989737 -2.529392 0.436615 -0.011637
2013-01-03 0.198157 1.269854 0.353568 1.431335
2013-01-04 0.501625 1.052571 0.802174 1.363464
2013-01-05 -0.763197 0.829456 -0.262123 0.308227
2013-01-06 -0.132503 -0.724279 0.277523 0.470121
>>>
>>> df2 = pd.DataFrame(
... {
... "A": 1.0,
... "B": pd.Timestamp("20130102"),
... "C": pd.Series(1, index=list(range(4)), dtype="float32"),
... "D": np.array([3] * 4, dtype="int32"),
... "E": pd.Categorical(["test", "train", "test", "train"]),
... "F": "foo",
... }
... )
>>> df2
A B C D E F
0 1.0 2013-01-02 1.0 3 test foo
1 1.0 2013-01-02 1.0 3 train foo
2 1.0 2013-01-02 1.0 3 test foo
3 1.0 2013-01-02 1.0 3 train foo
>>>
●DataFrame.to_numpy()
DataFrame に複数の異なるデータ型(例えば、整数、浮動小数点数、文字列など)が含まれている場合、to_numpy() メソッドで変換すると、NumPy 配列はすべてのデータを扱うために最も一般的な型である「オブジェクト型(object)」になる。
>>> df2
A B C D E F
0 1.0 2013-01-02 1.0 3 test foo
1 1.0 2013-01-02 1.0 3 train foo
2 1.0 2013-01-02 1.0 3 test foo
3 1.0 2013-01-02 1.0 3 train foo
>>>
>>> df2.to_numpy()
array([[1.0, Timestamp('2013-01-02 00:00:00'), 1.0, 3, 'test', 'foo'],
[1.0, Timestamp('2013-01-02 00:00:00'), 1.0, 3, 'train', 'foo'],
[1.0, Timestamp('2013-01-02 00:00:00'), 1.0, 3, 'test', 'foo'],
[1.0, Timestamp('2013-01-02 00:00:00'), 1.0, 3, 'train', 'foo']],
dtype=object)
>>>
つまりPandasをNumPyに変換することはできるけど、一つのDataFrameに豊富なデータ型を格納できるPandasに対して、NumPyは基本的に単一のデータ型しか認めないので、汎用性の高いオブジェクト型にしちゃうよということです。
VBAで言うところのVariant型に似てるんですかね?知らんけど。
●DataFrame.describe()でデータのサマリーが見れる
>>> df
A B C D
2013-01-01 0.374369 0.989339 -1.755549 -0.418254
2013-01-02 0.989737 -2.529392 0.436615 -0.011637
2013-01-03 0.198157 1.269854 0.353568 1.431335
2013-01-04 0.501625 1.052571 0.802174 1.363464
2013-01-05 -0.763197 0.829456 -0.262123 0.308227
2013-01-06 -0.132503 -0.724279 0.277523 0.470121
>>>
>>> df.describe()
A B C D
count 6.000000 6.000000 6.000000 6.000000
mean 0.194698 0.147925 -0.024632 0.523876
std 0.597195 1.495215 0.914677 0.741912
min -0.763197 -2.529392 -1.755549 -0.418254
25% -0.049838 -0.335846 -0.127212 0.068329
50% 0.286263 0.909398 0.315546 0.389174
75% 0.469811 1.036763 0.415854 1.140129
max 0.989737 1.269854 0.802174 1.431335
>>>
めちゃめちゃさらっと書いてあるけどめっちゃ便利じゃんと思ったので言及してみました。もはやこれだけでLinuxユーザーで普段Excel使ってる人(僕だけ?)はちょっとした分析ならもうこれで良くね?って思うレベルで簡単です。
●DataFrame.sort_indexについて
>>> df
A B C D
2013-01-01 0.374369 0.989339 -1.755549 -0.418254
2013-01-02 0.989737 -2.529392 0.436615 -0.011637
2013-01-03 0.198157 1.269854 0.353568 1.431335
2013-01-04 0.501625 1.052571 0.802174 1.363464
2013-01-05 -0.763197 0.829456 -0.262123 0.308227
2013-01-06 -0.132503 -0.724279 0.277523 0.470121
>>>
>>> df.sort_index(axis=1, ascending=False)
D C B A
2013-01-01 -0.418254 -1.755549 0.989339 0.374369
2013-01-02 -0.011637 0.436615 -2.529392 0.989737
2013-01-03 1.431335 0.353568 1.269854 0.198157
2013-01-04 1.363464 0.802174 1.052571 0.501625
2013-01-05 0.308227 -0.262123 0.829456 -0.763197
2013-01-06 0.470121 0.277523 -0.724279 -0.132503
>>>
>>> df.sort_index(axis=0, ascending=False)
A B C D
2013-01-06 -0.132503 -0.724279 0.277523 0.470121
2013-01-05 -0.763197 0.829456 -0.262123 0.308227
2013-01-04 0.501625 1.052571 0.802174 1.363464
2013-01-03 0.198157 1.269854 0.353568 1.431335
2013-01-02 0.989737 -2.529392 0.436615 -0.011637
2013-01-01 0.374369 0.989339 -1.755549 -0.418254
>>>
省略せずに書くと下記の通り
DataFrame.sort_index(axis=0, level=None, ascending=True, inplace=False, kind=’quicksort’, na_position=’last’)
axis:
ソートの軸の選択。
0 は行(インデックス)、1 は列(カラム)をソート。デフォルトは 0。
level:
マルチインデックスがある場合、特定のレベルでソート可能。
マルチインデックスとはインデックス自体に複数の階層があるような状態のことで、下記のような挙動をします。
>>> df
values
letters numbers
A 1 10
2 20
B 1 30
2 40
>>> df.sort_index(level='letters', ascending=False)
values
letters numbers
B 2 40
1 30
A 2 20
1 10
>>>
ascending:
昇順 (True) または降順 (False) を指定。デフォルトはTrue。
inplace:
True にすると元の DataFrame が変更され、新しい DataFrame は返されない。つまり取り扱い注意ということ。デフォルトはもちろんFalse。
kind:
ソートのアルゴリズムを指定。’quicksort’、’mergesort’、’heapsort’ から選べる。デフォルトは’quicksort’。
na_position:
NaN の位置を指定。’last’ または ‘first’ から選べる。デフォルトは’last’。
●特定の値でソートも可能
B列でソートした例
>>> df
A B C D
2013-01-01 -2.908666 1.624594 -0.122253 -0.293671
2013-01-02 -0.129870 0.970412 -0.730930 1.050840
2013-01-03 -1.084677 0.348689 -1.114978 -0.028002
2013-01-04 1.321775 -0.101257 -0.753428 0.058203
2013-01-05 -0.682837 -1.374697 -0.243080 -0.198001
2013-01-06 -0.111350 -0.872822 0.318165 0.223772
>>>
>>> df.sort_values(by="B")
A B C D
2013-01-05 -0.682837 -1.374697 -0.243080 -0.198001
2013-01-06 -0.111350 -0.872822 0.318165 0.223772
2013-01-04 1.321775 -0.101257 -0.753428 0.058203
2013-01-03 -1.084677 0.348689 -1.114978 -0.028002
2013-01-02 -0.129870 0.970412 -0.730930 1.050840
2013-01-01 -2.908666 1.624594 -0.122253 -0.293671
>>>
■おわりに
今日はここまでです。絶望的に進んでないんですが、User Guide(10 minutes to pandas)はかなり簡素に書いてあるので某F1チーム御用達と巷で話題の某CascadeのUser Guideみがあるのですが、さすがは超大人気のPandas、疑問に思ったところのリンクをぽちっとするとボリュームたっぷりのリファレンスに飛んでくれて一切詰まることがありませんでした。おかげさまで10 minutesで1項目も進んでないのですが、割と理解は進んでるかなという感じです。
あれ、気づいたら勉強時間のほとんどでAPI Reference読んでた…
■参考文献
- Andreas C. Muller, Sarah Guido. Pythonではじめる機械学習. 中田 秀基 訳. オライリー・ジャパン. 2017. 392p.
- pandas user guide – pandas v2.2.2 documentation. pandas.pydata.org. 2024. https://pandas.pydata.org/docs/user_guide/index.html
- ChatGPT. 4o mini. OpenAI. 2024.
https://chatgpt.com/