(修正版) NumPy/pandas使いのためのテスト自動化入門 / PyConJP2020

98df8bb11748bb59fef1aa1e474e8e02?s=47 komo_fr
August 29, 2020

(修正版) NumPy/pandas使いのためのテスト自動化入門 / PyConJP2020

PyCon JP 2020での発表スライドです。
---------------------------
(2020/08/30) 誤字を修正しました。
場所: p15
誤: assert_array_close()
正: assert_allclose()
---------------------------
(2020/08/31) 誤字を修正しました。pandas.util.testingは動作しますが、pandas1.0以降ではdeprecatedになっており代替としてpandas.testingを使うことが推奨されています。

場所: p17
誤: pandas.util.testing
正: pandas.testing

なお、p18のサンプルコードは元々pandas.testingで説明していたため変更はありません。
---------------------------

トークの詳細:
https://pycon.jp/2020/timetable/?id=203957
Togetter:
https://togetter.com/li/1583782

Twitter:
@komo_fr ( https://twitter.com/komo_fr )

98df8bb11748bb59fef1aa1e474e8e02?s=128

komo_fr

August 29, 2020
Tweet

Transcript

  1. /VN1ZQBOEBT࢖͍ͷͨΊͷ ςετࣗಈԽೖ໳ 1Z$PO+1  5PNPLP'VSVLJ 5XJUUFS!LPNP@GS(JU)VC!LPNPGS

  2. !LPNP@GS 8IPBN* !LPNP@GS 2 ॴଐ wגࣜձࣾϏʔϓϥ΢υ ʢ1ZUIPOͰσʔλղੳͷ͓࢓ࣄʣ w౦ژେֶઌ୺Պֶٕज़ݚڀηϯλʔ ʢݚڀऀ͕࢖͏ͨΊͷ1ZUIPOύοέʔδͷ։ൃʣ 1Z$PO+1

    w1Z$PO+1ʮQBOEBTͷ4UZMJOHػೳͰڧԽ͢Δ+VQZUFS࣮ݧϨϙʔτʯ w1Z$PO+1ʮ*OUFSBDUJWF/FUXPSL7JTVBMJ[BUJPOVTJOH1ZUIPO ɹɹɹɹɹɹɹɹɹʙ/FUXPSL9 #PLFIͰ1&1ͷࢀরؔ܎ΛՄࢹԽ͢Δʯ 5PNPLP'VSVLJ LPNP G S ൃച༧ఆ w1ZUIPOΠϯλϥΫςΟϒɾσʔλϏδϡΞϥΠθʔγϣϯೖ໳ ʕ1MPUMZ%BTIʹΑΔσʔλՄࢹԽͱ8FCΞϓϦߏஙʕʢே૔ॻళ!ESJMMFSɾখ઒ӳ޾ɾݹ໦༑ࢠஶ  wIUUQXXXBTBLVSBDPKQCPPLTJTCO
  3. !LPNP@GS ࠓ೔࿩͢͜ͱ w ಺༰ w 1ZUIPOΛ࢖ͬͯ਺஋࣮ݧ΍σʔλॲཧΛߦ͏ਓʹରͯ͠ /VN1Z΍QBOEBTʹඋΘ͍ͬͯΔςετͷػೳʹ͍ͭͯ ঺հ͠·͢ w ର৅

    w /VN1Z΍QBOEBTΛ࢖ͬͨܦݧ͕͋Δ͕ ීஈςετΛॻ͘श׳͕ͳ͍ਓ w 4MJEF w 5XJUUFS্Ͱ63-Λެ։͠·͢ 3
  4. !LPNP@GS "HFOEB w ͳͥςετίʔυ͕ඞཁͳͷʁ w QZUFTUʹΑΔςετίʔυ w ։ൃʹ͓͚Δςετͱͷҧ͍ରԠ w ֬ೝ͍ͨ͠ର৅͕/VN1Z΍QBOEBTͷσʔλߏ଄

    w ظ଴஋Λఆٛ͢Δίετ͕ߴ͍ w ύϑΥʔϚϯεΛνΣοΫ͍ͨ͠ w ·ͱΊ 4
  5. !LPNP@GS ͳͥςετίʔυ͕ඞཁͳͷʁ  w Α͋͘Δ͓೰Έྫ w ʮ͜ͷσʔλΛ࢖ͬͯ˓˓ͳ͜ͱ͕Ͱ͖ͳ͍͔ʯͱ ະ੔උͷσʔλΛ͍ͨͩ͘ w +VQZUFS/PUFCPPL্ͰQBOEBTͳͲͰσʔλ֬ೝɺ

    ΰϦΰϦલॲཧɺ࣮ݧ w ͱͯ΋టष͍ॲཧௐࠪ w ͜ͷ࣌఺Ͱ͸͜ͷίʔυ͕࠶ͼ࢖ΘΕΔ͔Ͳ͏͔͸ Θ͔Βͳ͍ͷͰɺอकੑ͸ॏࢹ͞Εͳ͍͜ͱ͕ଟ͍ w ࣮ݧ݁ՌΛݟͯɺ࣍ͷεςοϓʹਐΉ w อकੑΛॏࢹͤͣʹॻ͍ͨίʔυͱ޲͖߹͏͜ͱʹ 5
  6. !LPNP@GS ͳͥςετίʔυ͕ඞཁͳͷʁ  w ޙʑͭΒ͘ͳΔύλʔϯ w QSJOUจ΍+VQZUFS/PUFCPPLͷηϧ্Ͱ ग़ྗ݁ՌΛ໨ࢹνΣοΫ w +VQZUFS/PUFCPPLΛίϐϖͯͪ͠ΐͬͱͣͭม͑ͯ࢖͍ճ͢

    w ஈʑ+VQZUFS/PUFCPPL͕ංେԽͯ͘͠Δ w Կ͕ࠩ෼ͳͷ͔Θ͔Βͳ͍ w ࣗ෼ͷίʔυ͕ਖ਼͘͠ಈ͍͍ͯΔ͜ͱΛอূͰ͖ͳ͍  ࣮ݧ݁Ռ͕ਖ਼͍͜͠ͱΛอূͰ͖ͳ͍ 6
  7. !LPNP@GS +VQZUFS/PUFCPPL͔ΒQZ΁ w +VQZUFS/PUFCPPL্ͷॲཧΛؔ਺ͱͯ͠੾Γग़͢ w ੾Γग़ͨؔ͠਺ΛQZϑΝΠϧʹҠ͢ w ੾Γग़ͨ͠ॲཧʹ͍ͭͯɺ ςεςΟϯάϑϨʔϜϫʔΫΛ࢖ͬͯςετίʔυΛॻ͘ w

    QZUFTU w /VN1Z QBOEBTଞɺσʔλαΠΤϯεͰΑ͘࢖ΘΕΔ044 Ͱ࠾༻͞Ε͍ͯΔͷͰɺςετίʔυΛࢀߟʹ͠΍͍͢ w ʰςετۦಈ1ZUIPOʱʢᠳӭࣾʣ 7
  8. !LPNP@GS QZUFTUʹ͓͚Δςετίʔυͷྫ 8 ςετର৅ͷίʔυ ࣮ࡍͷ஋ ظ଴͢Δ஋ ςετίʔυ IUUQTEPDTQZUFTUPSHFOTUBCMF

  9. !LPNP@GS QZUFTUʹ͓͚Δςετίʔυͷྫ 9 IUUQTEPDTQZUFTUPSHFOTUBCMF

  10. !LPNP@GS QZUFTUʹ͓͚Δςετίʔυͷྫ 10 ςετର৅ͷίʔυ ࣮ࡍͷ஋ ظ଴͢Δ஋ ςετίʔυ Y ʹमਖ਼ IUUQTEPDTQZUFTUPSHFOTUBCMF

  11. !LPNP@GS ςετͷೖ໳ʹ޲͍͍ͯΔίʔυ w ग़ྗ͕໌֬ͰɺԿճ΋मਖ਼͢Δػձ͕͋Δίʔυ w σʔλ੔ܗ΍ม׵ͷ෦෼ w ྫ ϩʔΧϧʹ͋Δ)5.-ϑΝΠϧ͔ΒσʔλΛநग़ͯ͠ DTWܗࣜʹม׵͢Δલॲཧ

    w ग़ྗ͕໌֬ͳͷͰɺςετΛॻ͖΍͍͢ w ೖྗ͸ͨ·ʹ૝ఆ͠ͳ͍ܗࣜͷIUNM͕དྷΔमਖ਼ػձଟ w ਺ࣜΛ࣮૷͍ͯ͠Δ෦෼ 11
  12. ։ൃʹ͓͚Δςετͱͷҧ͍ ରԠ

  13. !LPNP@GS ։ൃʹ͓͚Δςετͱͷҧ͍ w ֬ೝ͍ͨ͠ର৅͕/VN1Z΍QBOEBTͷσʔλߏ଄ w ޡࠩΛڐ༰ͯ͠ςετ͍ͨ͠ w ߦ΍ྻͷฒͼ·ͰݫີʹνΣοΫ͍ͨ͠έʔεɺཁૉͷ஋͑͋ͬ͞ ͍ͯΕ͹ྑ͍έʔεɺܕͷҧ͍ʢJOUͱqPBUͳͲʣ͸ڐ༰͍͍ͯ͠ έʔε

    w ὎/VN1Z QBOEBT͕ఏڙ͍ͯ͠Δςετ༻ͷػೳΛ࢖͏ w ظ଴஋Λఆٛ͢Δίετ͕ߴ͍ w ὎લճ࣮ߦͨ࣌͠ͷ஋Λظ଴஋ʹ࢖͏ w ύϑΥʔϚϯεΛνΣοΫ͍ͨ͠ w ὎QZUFTUCFODINBSL 13
  14. !LPNP@GS ։ൃʹ͓͚Δςετͱͷҧ͍ w ֬ೝ͍ͨ͠ର৅͕/VN1Z΍QBOEBTͷσʔλߏ଄ w ޡࠩΛڐ༰ͯ͠ςετ͍ͨ͠ w ߦ΍ྻͷฒͼ·ͰݫີʹνΣοΫ͍ͨ͠έʔεɺཁૉͷ஋͑͋ͬ͞ ͍ͯΕ͹ྑ͍έʔεɺܕͷҧ͍ʢJOUͱqPBUͳͲʣ͸ڐ༰͍͍ͯ͠ έʔε

    w ὎/VN1Z QBOEBT͕ఏڙ͍ͯ͠Δςετ༻ͷػೳΛ࢖͏ w ظ଴஋Λఆٛ͢Δίετ͕ߴ͍ w ὎લճ࣮ߦͨ࣌͠ͷ஋Λظ଴஋ʹ࢖͏ w ύϑΥʔϚϯεΛνΣοΫ͍ͨ͠ w ὎QZUFTUCFODINBSL 14
  15. !LPNP@GS /VN1ZͷͨΊͷςετ w OVNQZUFTUJOHϞδϡʔϧ w /VNQZͷςετͷαϙʔτʹಛԽͨ͠Ϟδϡʔϧ w IUUQTOVNQZPSHEPDTUBCMFSFGFSFODFSPVUJOFTUFTUJOHIUNM w OQUFTUJOHBTTFSU@BSSBZ@FRVBM

     w /VN1Z഑ྻΛൺֱͯ͠ɺ ෆҰகͩͱྫ֎"TTFSUJPO&SSPSΛग़ྗ͢Δ w ग़ྗ݁Ռ͕આ໌తͰɺ ҧ͏ͷ͕஋ͳͷ͔ܗঢ়ͳͷ͔ڭ͑ͯ͘ΕΔ w OQUFTUJOHBTTFSU@BMMDMPTF  w ුಈখ਺఺Λ࣋ͭ/VN1Z഑ྻͷൺֱʹ࢖͏ w ࠩ෼ͷڐ༰஋ΛύϥϝʔλͰࢦఆͰ͖Δ 15
  16. !LPNP@GS OQUFTUJOHBTTFSU@BSSBZ@FRVBM 16 ࣮ߦ݁Ռ ࣮ߦ݁Ռ ஋͕ҟͳΔ৔߹ ܗঢ়͕ҟͳΔ৔߹

  17. !LPNP@GS QBOEBTͷͨΊͷςετ w QBOEBTUFTUJOHϞδϡʔϧ w BTTFSU@GSBNF@FRVBM  w QBOEBTͷσʔλϑϨʔϜΛൺֱ͠ɺ ෆҰகͩͱྫ֎"TTFSUJPO&SSPSΛൃੜͤ͞Δ

    w Ͳ͜·ͰݫີʹҰகੑΛݟΔͷ͔Ҿ਺ͰࢦఆͰ͖Δ ʢܕɺྻ΍ߦͷฒͼॱͳͲʣ w BTTFSU@TFSJFT@FRVBM  w BTTFSU@JOEFY@FRVBM 17
  18. !LPNP@GS BTTFSU@GSBNF@FRVBM 18 ࣮ߦ݁Ռ

  19. !LPNP@GS ։ൃʹ͓͚Δςετͱͷҧ͍ w ֬ೝ͍ͨ͠ର৅͕/VN1Z΍QBOEBTͷσʔλߏ଄ w ޡࠩΛڐ༰ͯ͠ςετ͍ͨ͠ w ߦ΍ྻͷฒͼ·ͰݫີʹνΣοΫ͍ͨ͠έʔεɺཁૉͷ஋͑͋ͬ͞ ͍ͯΕ͹ྑ͍έʔεɺܕͷҧ͍ʢJOUͱqPBUͳͲʣ͸ڐ༰͍͍ͯ͠ έʔε

    w ὎/VN1Z QBOEBT͕ఏڙ͍ͯ͠Δςετ༻ͷػೳΛ࢖͏ w ظ଴஋Λఆٛ͢Δίετ͕ߴ͍ w ὎લճ࣮ߦͨ࣌͠ͷ஋Λظ଴஋ʹ࢖͏ w ύϑΥʔϚϯεΛνΣοΫ͍ͨ͠ w ὎QZUFTUCFODINBSL 19
  20. !LPNP@GS લճ࣮ߦͨ࣌͠ͷ஋Λظ଴஋ͱͯ͠࢖͏ w ίʔυͷมߋʹΑͬͯӨڹ͕ग़͍ͯͳ͍͜ͱ͚ͩΛ֬ೝ͢Δ ʢճؼςετʣ w Ұ౓+VQZUFS/PUFCPPL্Ͱ࣮ߦɾ֬ೝࡁͷίʔυͳΒɺ ͦͷ࣌ͷ݁ՌΛσʔλΛ$47ग़ྗͯ͠ظ଴஋ͱͯ͠࢖͏ w TOBQTIPUUFTUύοέʔδΛ࢖͏

    w ಛఆͷ࣌఺ͷίʔυͷग़ྗΛه࿥͠ɺ ίʔυมߋ࣌ʹग़ྗʹมԽ͕ͳ͍͔νΣοΫͰ͖Δ 20
  21. !LPNP@GS ։ൃʹ͓͚Δςετͱͷҧ͍ w ֬ೝ͍ͨ͠ର৅͕/VN1Z΍QBOEBTͷσʔλߏ଄ w ޡࠩΛڐ༰ͯ͠ςετ͍ͨ͠ w ߦ΍ྻͷฒͼ·ͰݫີʹνΣοΫ͍ͨ͠έʔεɺཁૉͷ஋͑͋ͬ͞ ͍ͯΕ͹ྑ͍έʔεɺܕͷҧ͍ʢJOUͱqPBUͳͲʣ͸ڐ༰͍͍ͯ͠ έʔε

    w ὎/VN1Z QBOEBT͕ఏڙ͍ͯ͠Δςετ༻ͷػೳΛ࢖͏ w ظ଴஋Λఆٛ͢Δίετ͕ߴ͍ w ὎લճ࣮ߦͨ࣌͠ͷ஋Λظ଴஋ʹ࢖͏ w ύϑΥʔϚϯεΛνΣοΫ͍ͨ͠ w ὎QZUFTUCFODINBSL 21
  22. !LPNP@GS QZUFTUCFODINBSL w QZUFTUͷϓϥάΠϯ w ϓϩάϥϜͷಛఆ෦෼ͷύϑΥʔϚϯεΛܭଌ͢ΔςετΛ࡞Ε Δ w ࣮ߦ࣌ؒͷཁ໿౷ܭྔ΍ώετάϥϜͷग़ྗ w

    աڈͷ݁ՌΑΓύϑΥʔϚϯε͕ѱԽ͍ͯͨ͠ΒΤϥʔʹ͢Δ ʢCFODINBSLDPNQBSFΦϓγϣϯʣ 22
  23. ·ͱΊ

  24. !LPNP@GS ·ͱΊ w ਺஋࣮ݧ΍σʔλॲཧΛߦ͏ਓʹͱͬͯͷ ςετͷϝϦοτʹ͍ͭͯ঺հ͠·ͨ͠ w ςετίʔυΛॻ͘ͱ҆৺࣮ͯ͠ݧ΍෼ੳ͕ߦ͑Δ w ։ൃͱҟͳΔ఺ͱରԠʹ͍ͭͯ঺հ͠·ͨ͠ w

    ϝϦϋϦΛ͚ͭͯςετίʔυΛॻ͍ͯɺ ਫ਼ਆ͕҆ఆ࣮ͨ͠ݧΛ͠·͠ΐ͏ 24