Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

オトナのpandas勉強会(資料)

481 views

Published on

オトナのプログラミング勉強会2020年2月19日の「pandasの勉強会」で使ったスライド資料です。

Published in: Data & Analytics
  • Be the first to comment

オトナのpandas勉強会(資料)

  1. 1. 2020-02-19 森下功啓 1
  2. 2. pandasの紹介と⽤語の整理
  3. 3. pandasとは • pandasは、Pythonの表形式データの読み書き⽤ライブラリ • Excel, csv, tsv, HTML tableなどの⼊出⼒に対応 • 統計処理,条件抽出,結合が簡単 • 例えば、「⾵速30 m/sを超えた⽇数を調べたい」などに最適 • jupyterと相性が良い 3 HTML table HTML table IN OUT pandasで何か処理
  4. 4. グラフを作るのも簡単 • 単独でもグラフは描ける • seabornと組み合わせるとなお良い • なぜか描画が遅い import pandas as pd import seaborn as sns df = pd.read_csv('iris.csv') sns.pairplot(df, hue='species') # hueで層別プロット
  5. 5. 最近に森下が使った例 • バスの乗降データを分析 • VBAで数時間でも処理が全く終わらないものを300秒で処理 • 成績通知書へのコメントの⾃動⽣成 • 気象データの処理 • 機械学習予測結果の整理 5
  6. 6. DataFrame型 • pandasでは、表形式データをDataFrame型オブジェクトで扱う • DataFrameはExcelでいうと、1枚のシートに相当 • ↓の例では、空のDataFrameを作成している 6 import pandas as pd df = pd.DataFrame() dfはDataFrameの略で、よく使われる名前
  7. 7. Series型 • DataFrameには新しいレコードや列を追加できる • また、レコードや列を分離・コピーもできる • 特定のレコードや列をコピーすると、Series型というオブジェ クトになる 7 Series型のオブジェクトにデータが格 納された状態となる
  8. 8. 基本⽤語 8 空ではないDataFrameを表⽰させた例 index カラム名 (列名) ⾏ レコードともいう 列
  9. 9. DataFrameをjupyterで表⽰させると・・・ • jupyter(Colaboratory)は、セルの最後に書いた変数の中⾝を表⽰する • この機能で表⽰すると、DataFrameの中⾝が罫線付きで表⽰される • ⾮常に便利なので、この機能を使ってDataFrameの状態を確認しよう 9 表⽰させている例
  10. 10. pandasの使い⽅
  11. 11. Excelファイルの読み込み • read_excel()を使う • 引数はファイル名とシート名かシートの番号 11 import pandas as pd df = pd.read_excel("sample_excel.xlsx", sheet_name=0) 引数のsheet_nameはデフォル トで0。シート名でもOK 第1引数が読み込ませ たいファイル名 pandasが使える様に、ライブ ラリをインポート ただし、pandasは名前が⻑いの で、pdと略せる様にas pd
  12. 12. CSVファイルの読み込み • CSVはカンマ区切りのテキスト • 読み込むコード例→ • csvファイルはExcelで編集できるが、 Excelのファイルではない 12 import pandas as pd # CSVファイルの読み込み df = pd.read_csv("sample_csv.csv") SublimeTextで表⽰したcsvファイルの例 カンマで値が分離されている。 Excelファイルと異なり、テキストファイルだ。
  13. 13. TSVファイルの読み込み • TSVはタブ区切りのテキスト • 読み込むコード例→ • 引数にdelimiterを指定 • delimiterは「区切り⽂字」と いう意味 • tはWindowsではタブ⽂字 • はMacやLinuxでは\の半⾓ 13 import pandas as pd # TSVファイルの読み込み # ↓PDFでコピーすると、 # が変なUnicodeに変換されてエラー df = pd.read_csv("sample_tsv.tsv", delimiter= "t") SublimeTextで表⽰したcsvファイルの例 タブ⽂字で値が分離されている。 Excelファイルと異なり、テキストファイルだ。
  14. 14. Web上の表を読み込む • 気象庁のアメダスのリアルタイム観測結果を読み込んでみよう • http://www.jma.go.jp/jp/amedas_h/today-86141.html?areaCode=000&groupCode=62 14 この表が欲しい htmlのtableタグ構造の解析は⾯倒なので、pandasを使う
  15. 15. 15 import pandas as pd # HTMLのtableを読み込む(DataFrameのlistで返ってくる) url = "http://www.jma.go.jp/jp/amedas_h/today-86141.html?areaCode=000&groupCode=62" df_list = pd.read_html(url) df = df_list[4] # アメダス(熊本)の今⽇の観測データが格納されているハズ DataFrameに取り込んだ表を表⽰させた様⼦ アメダスのWebサイトのHTMLコードには、 tableが複数含まれており、欲しい表が格納さ れたDataFrameには要素番号4でアクセス @2019年10⽉ • read_html()を使う
  16. 16. 読み込み時によく使う引数 • skiprows:読み⾶ばす⾏を指定 • 例:skiprows=[0,1,3] # 1⾏⽬、2⾏⽬、4⾏⽬を読み⾶ばす • na_values:⽋測扱いとする⽂字列を複数指定 • 例: na_values="⽋測", na_values=["⽋測", "NaN"] • encoding:⽂字コードを指定 • 例:encoding="shift_jis" # UTF-8なら指定の必要はない • header:カラム名の指定。表にカラム名が無い場合は、header=Falseとする • header=3として、4⾏⽬をカラム名に指定することもできる 16 元ファイル 余計な⾏や、⽋測値を含む 必要な部分だけ読み込み、⽋測値をNaN(⾮値)にできた
  17. 17. pandasの基本技 ―型の確認― • 各カラムの型がintなのかobject(⽂字列)なのか、確認する • dtypesプロパティを使う • int64は符号付整数64 bit型を表す • objectは⼤抵は⽂字列 • データの中に⽂字列が⼊るとobject 17 型を確認している様⼦ *objectになった列をどうにかするのは次回以降
  18. 18. pandasの基本技 ―基本統計量― • 平均などを求めるために、 describe()を使う 個数 平均 標準偏差 最⼩ 25%値 中央値 75%値 最⼤
  19. 19. 数値以外の基本統計量 • 除くという意味の引数excludeを使う 個数 ⼀意な値の要素の個数 最頻値 最頻値の個数
  20. 20. pandasの基本技 ―カラム名の変更 1― • カラム名を変更せざる得ないことがある • ライブラリが⽇本語に対応していない場合などだ • 書き換え⽅法は2通りあるが、簡単な⽅を紹介する 書き変わっている
  21. 21. 基本的なグラフ • plot()やscatter()を使う scatter()は散布図 plot()は折れ線グラフ x軸も指定できる
  22. 22. pandasの基本技 ―スライス― • list型が持っているスライス機能をDataFrameも持っている 22 スライスした例 1⾏⽬〜2⾏⽬が削除されている。 説明はスキップして良い たまにdf = df[2:]としてしまってdfを上書 きしてしまう⼈が居ますが、以降の処理で インデックスと⾏番号がズレてエラーにな ります。その場合は、データの読み込みか らやり直してください。
  23. 23. pandasの基本技 ― ndarray型に変換― • DataFrameはvaluseプロパティでndarray型に変換できる • 数値データの読み込みで便利 23 この⽅法でのデータ配布・読み込 みは試験でしばしば使います
  24. 24. pandasの基本技 ―セル、⾏の指定― • ⼀⾏丸ごと変更したい、特定のセルだけ修正したいなどの場合 • iloc • ⾏・列番号(数値)で指定 • 列や⾏単位で取得できるし、複数の列・⾏も指定できる • loc • ⾏・列のindex(名前)で指定 • 列や⾏単位で取得できるし、複数の列・⾏も指定できる • iat • ⾏・列番号(数値)で指定 • 1つのセルを指定できる(この⽤途ではilocより⾼速) • at • ⾏・列のindex (名前)で指定 • 1つのセルを指定できる(この⽤途ではlocより⾼速) • DataFame変数名["列名"]でも1列を指定できる
  25. 25. 使い⽅ • 特定の⾏を番号で指定する場合 • 特定の列をindexで指定する場合 [⾓カッコ]を使って指定す るのが独特な気がする。:は、範囲を表すのに使うが、数値を前 後に書かないと全部という意味になる。 フィールドは⾏・列の順。
  26. 26. 利⽤例 値に「 )」が付いていたら削除 • AMeDASでは、観測値に⾃信がないときなどに「 )」を付ける • 他にもパターンがある • 後で困るので、余計な値を取り除く必要がある • ここでは、降⽔量(mm)列から「 )」を除外してみる
  27. 27. pandasの基本技 ―型変換― • 特定の列の型をint型からfloat型に変換したいことがある • 逆パターンもある • 前スライドで降⽔量の列から余計な⽂字列を削除しているので、 列の型を丸ごと変えたい • astype()を使う 型がfloat型に変わった
  28. 28. ⽇付の⽂字列をdatetime64型に変換する例 • 時系列データを使って横軸を時刻に指定する場合に有⽤ • pandasのto_datetime()を使う • 複雑な書式の場合は書式を指定する
  29. 29. pandasの基本技 ―⾮値の処理 1― • ⾮値は統計上扱いが難しい • ⾮値を含むレコードの削除は簡単。 dropna()メソッドを使う • ただし、標本数が少なかったり、⽋測が多いと削除しづらい • 時には、⾮値は列の平均やパターンから予測した値に変換する 29 NaNを含む全レコードを削除する例
  30. 30. pandasの基本技 ―⾮値の処理 2― • 特定の列に⾮値NaNを含むレコードを削除したいことがある • dropna()メソッドを使う • ただし、引数subsetに、対象の列名のリストを指定する 30 説明はスキップして良い
  31. 31. ⾮値を含む⾏(レコード)を表⽰ • ⾮値を含む⾏のみを表⽰したいこともある • isnull()を使うと、⾮値の⾏がTrueになったリストが得られる • DataFrameに対して、[]で列名ではなく[True, False, ・・・] の様なリストを渡すとTrueの⾏だけ取り出せる • 合わせれば、特定の列が⾮値の⾏のみ抽出できる 説明はスキップして良い
  32. 32. ⾮値を特定の値に置換する例 • ⾮値NaNを特定の値に置換するにはfillna()を使う • 引数に辞書を渡すと、列ごとに異なる値に置換できる NaNが0に変わった 辞書
  33. 33. pandasの基本技 ―条件で抽出― • 条件に合致するレコードのみを抽出 33 上記のような記述で、条件に合致する⾏が Trueとなったbool値がリスト状になったデータが返る 条件に合致するレコードのみを取り出せる DataFrameにbool値のリストを渡すと、True に該当するレコードのみを抽出できる
  34. 34. 複数条件の指定 • 複数の条件は、()で囲って、&や|でつなぐ • &はand, |はor • ↓「⾵速3m以上かつ⾵向が北」の抽出例 34 (カッコ)で囲う &や|でつなぐ
  35. 35. pandasの基本技 ―ヒストグラム― • DataFrameのhist()関数でヒストグラムは描画されるが、、、 • やや⾒ずらいのと、⽇本語に対応していない • カラム名を書き換えた上で、パラメータをセット • hist()の引数binsに分割数を渡す • 引数figsizeはグラフのサイズで、タプルで縦横を指定
  36. 36. せっかくなので、時系列グラフを描く • 時刻を⽂字列から時刻オブジェクトに変換したので、横軸を時 間としたグラフが描けるようになった • 気温の変化をプロットした例を⽰す 実⾏結果 たまにひげが下に伸びて いて、データがおかしい のが分かる 説明はスキップして良い
  37. 37. pandasの基本技 ―相関⾏列― • corr()で相関⾏列を計算できる • パッと⾒で、なんとなく関係のありそうなカラムが分かる この気象データは ほぼ無相関
  38. 38. pandasの基本技 ―保存― • DataFrameはCSVやExcel形式でファイルに保存できる • 「ModuleNotFoundError: No module named 'openpyxl'」と表⽰さ れたら、モジュール不⾜ • pip install openpyxlでモジュールをインストール(管理者権限が必要かも) 38 # CSV形式で保存する(index=Falseで、インデックス(通し番号・⾏名)は省略して保存) df2.to_csv("save_sample.csv", index=False) # デリミタ(区切り⽂字)も指定可能 df2.to_csv("save_sample_utf8.csv", index=False, encoding="utf-8-sig") # ⽂字コードを指定 # Excel形式で保存する(index=Falseで、インデックス(通し番号・⾏名)は省略して保存) df2.to_excel("save_sample.xlsx", index=False) *encoding=“utf-8-sig”はBOM付きのUTF-8で保存することを指⽰している。2016年度の Windows環境ではBOM付きの⽅がExcelで閲覧しやすい。
  39. 39. 実⾏すると、、 ファイルが増える
  40. 40. csvで保存したファイルをテキストエディタ で表⽰させた様⼦ • 半⾓カンマでフィールドが区切られている • encodingを指定しない場合、⽂字コードはWindowsではshift-jisかも 40 ⽂字コードがUTF-8で保存されたsave_sample.csvをSublime Textで表⽰させた様⼦
  41. 41. 付録 41
  42. 42. 注意 • 2018年より以前の古いpandasでは⽇本語ファイル名のExcelファイルを 読み込むとエラーが出るかもしれません • ⽇本語を含むcsvファイルは、⽂字コードを指定してください • ⽇本語を含むcsvファイルを保存する際は、⽂字コードをUTF-8に 42
  43. 43. 参考⽂献 • jupyter notebookの使い⽅ • https://www.slideshare.net/katsuhiromorishita/google-colaboratory-177618719 • pandas公式サイト • https://pandas.pydata.org/index.html • Python Pandasでのデータ操作の初歩まとめ • https://qiita.com/hik0107/items/d991cc44c2d1778bb82e • pandasで公共⽤⽔域⽔質測定データ分析のTips • http://estuarine.jp/2016/07/python_jpwq/ • 建築環境⼯学系⽇記 Pythonでグラフを描く • http://www.kankyoukei.com/2017/03/python.html 43
  44. 44. 参考⽂献 • Python, pandas, seabornでペアプロット図(散布図⾏列)を作成 • https://note.nkmk.me/python-seaborn-pandas-pairplot/ • PythonでPandasのPlot機能を使えばデータ加⼯からグラフ作成 までマジでシームレス • https://qiita.com/hik0107/items/de5785f680096df93efa

×