AI-python-code-all

Py

使い方のコツ|問い合わせ

繰り返し学んでプログラミングスキルを磨こう!PyQで学習内容を読み返して復習できる機能を追加しました - Python学習チャンネル by PyQ

「未経験からのPython文法」コース Pythonはじめの一歩

5. print()、変数

  • 5-1: print関数の使い方とよくあるエラー

    • 構文エラー
      • プログラムの決まりを守って記述できていない
    • 例外
      • 文法には問題がないが、実行するとエラーが発生する
    • Name error

      • ...

      • エラーが出た場合、エラーメッセージを詳しく見ると原因がわかります。

        • • 2行目はエラーの発生ファイル名、エラー発生行。

        • ファイル名はprint_name.pyです。画面に表示されていませんが、右側のコードのファイル名です。
          進捗: 0%

        • エラー発生行はline 2とあるので、print_name.pyの2行目です。
          進捗: 0%

        • • 最後の行にはNameError、name 'prant' is not definedと表示されています。

        • 1番目のNameErrorはエラーの種類です。
          進捗: 0%

        • 2番目のname 'prant' is not definedは例外が発生した原因。直訳すると名前prantは定義されていませんです。
          進捗: 0%

      • このエラーの原因はprintを間違って、prantと書いたことです。

    • syntax error
      • SyntaxError: EOL while scanning string literal
      • SyntaxErrorはプログラムの書き方が間違っている場合に発生します。この構文エラーが発生したら、文法的に間違いがないか確認しましょう。
  • 5-2: 変数への代入と利用
  • 5-3: 文字列の結合方法

    • コード

      • course = 'Python'

        文字列と結合して表示する
        print('こんにちは、' + '鈴木さん') # 文字列同士
        print(course + 'コースへようこそ') # 文字列と変数

      • age = 30
        年齢を表示しよう
        str()を用いることにより、数値が代入された変数と文字列を結合できました。
        print(str(age) + '才')

    • TypeError

      • TypeError: can only concatenate str (not "int") to str
        • 文字列(str)への結合(concatenate)は、数値(int)ではなく、文字列(str)でなければなりません。
  • 5-4: 文字列と変数を使ったプログラムを書く演習

6. 計算、if文

  • 6-1: 四則演算と剰余の使い方

      • 商の整数部分
        print(10 // 3)

      • 余り
        print(10 % 3)

  • 6-2: 変数を利用した計算

    • コード

      • 在庫本数
        stock = 97
        配達本数
        delivery = 20

        在庫計算
        new_stock = stock + delivery
        print('現在の在庫は' + str(new_stock) + '本')

        ダース単位の在庫計算
        dozen = new_stock // 12
        print('残り' + str(dozen) + 'ダース')

  • 6-3: if文の基本

    • else

      • 在庫数で注文するかどうかを判定
        stock = 10

        if stock < 10:
        print('注文する')
        else:
        print('注文しない')
        print('現在の在庫は' + str(stock) + '本です')

    • random関数(ランダム関数)

      • import random # 書き換え不可

        stock = 24
        random_used = random.choice([4, 5]) # 書き換え不可

  • 6-4: 比較演算

    • 等しくない
      • xが10と等しくない場合「xは10ではない」と表示
        if x != 10:
  • 6-5: if文でのelifの書き方

    • elif

      • import random # 書き換え不可

        在庫数の確認
        stock = random.choice([8, 10, 12]) # 書き換え不可
        print('stock=' + str(stock))

        if stock < 10:
        print('在庫は10本より少ない')
        elif stock == 10:
        print('在庫は10本')
        elif stock > 10:
        print('在庫は10本より多い')

  • 6-6: 数値の計算、if文を使ったプログラムの演習

7. list, for文

  • リストの作成・追加

    • リストの作成・参照

      • リストnumbers作成
        numbers = [100, 200, 300, 400, 500]

        先頭の要素の表示
        print(numbers[0])
        末尾の要素の表示
        print(numbers[-1])
        末尾から2番目の要素の表示
        print(numbers[-2])

    • リストのスライス

      • リストweekの作成
        week = ['月', '火', '水', '木', '金']

        3番目から4番目までの部分リスト
        print(week[2:4])
        先頭から3番目までの部分リスト
        print(week[:3])
        4番目から末尾までの部分リスト
        print(week[3:])

    • リストの途中に値を追加

      • リストnumbers作成
        numbers = [100, 200, 300, 400, 500]

        要素追加
        numbers.insert(1, 150) # 2番目
        4番目
        numbers.insert(3, 250)
        表示
        print(numbers)

        • 位置は数値で表します。0からはじまり、0は1番目を表し、1は2番目を表します。
    • リストの末尾に値を追加

      • リストfruit作成
        fruit = ['桃', '栗', '柿']
        末尾への梨の追加
        fruit.append('梨')
        表示
        print(fruit)

        • 実行結果
          ['桃', '栗', '柿', '梨']
  • 7-4: リストからの値の削除

    • 末尾の要素の削除

      • リストnumbersの作成
        numbers = [100, 200, 300, 400, 500]

        末尾の要素の削除
        numbers.pop()
        表示
        print(numbers)

        • 実行結果
          [100, 200, 300, 400]

        • リスト.pop()を使うと、リスト末尾の要素を削除

    • 途中の要素の削除

      • リストnumbers作成
        numbers = [100, 200, 300, 400, 500]
        2番目の要素の削除
        numbers.pop(1)
        表示
        print(numbers)

        • 実行結果
          [100, 300, 400, 500]
  • 7-5 リストの値を変更

    • リストnumbers作成
      numbers = [100, 200, 300, 400, 500]
      1番目の要素の変更
      numbers[0] = 50
      表示
      print(numbers)
  • 7-6: リストの繰り返し処理(ループ)を使おう

    • 曜日のリストを表示

      • リストweekの作成
        week = ['月', '火', '水', '木', '金']

        リストweekの内容を1つずつ表示しましょう。
        for day in week:
        print(day)

8. 辞書

  • 健康診断結果を扱うプログラム

    • データをまとめる空の辞書を作る
      health_result = {}

      要素の追加
      health_result['名前'] = '佐藤'
      health_result['年齢'] = 35
      health_result['体重'] = 60
      health_result['身長'] = 170
      health_result['視力'] = 2.0

      身長、体重の表示
      print(health_result['名前'], 'さんの', sep='')
      print('身長は', health_result['身長'], 'cmです', sep='')
      print('体重は', health_result['体重'], 'kgです', sep='')

      • 辞書とはキーと、対応する値を値を持つデータ
  • 初期データをもった辞書の作成

    • データを持つ辞書を作る
      health_result = {"名前" : "佐藤",
      "身長" : 170,
      "体重" : 60}
      print(health_result)
  • 8-3: 辞書の値の更新方法

    • 値の変更
      • health_result = {'名前': '佐藤', '年齢': 35, '身長': 170, '体重': 60, '視力': 2.0}
        辞書の値の変更:名前を鈴木に変更
        health_result["名前"] = "鈴木"
        print(health_result)
  • 8-4: 辞書の値の削除

    • health_result = {'名前': '鈴木', '年齢': 35, '身長': 170, '体重': 60}
      年齢を削除
      del health_result["年齢"]
      del health_result["年齢"]
      age = health_result.pop("年齢")
      print(health_result)
      print(age) # 削除した値を表示

      • 辞書.pop() を利用すると、利用した値を順々に辞書から削除できます。
  • 8-5: 辞書にキーが存在するかを判定しよう

    • health_result = {'名前': '佐藤', '年齢': 35, '身長': 170, '体重': 60, '視力': 2.0}

      体脂肪の値を表示
      体脂肪が辞書に含まれていれば
      if '体脂肪' in health_result:
      print('体脂肪は', health_result['体脂肪'], '%です', sep='')
      else:
      print('体脂肪は項目にありません')

9. 集計

  • 9-4: リストとfor文、辞書を応用して集計しよう

    • 9-4-1 計算を省略 (代入演算子、インクリメントを省略)

      • x = 10
        y = 10

        xを1増加、yを1減少させましょう。
        x +=1 #x= x + 1と同じ
        y -=1
        print('x =', x)
        print('y =', y)

        • -- 実行結果 --
          x = 11
          y = 9
      • 補足

        • ...
  • 9-5: for文とif文を組み合わせた高度な集計
    • 特筆する問題はなかった
  • 9-6: for文とif文を組み合わせたプログラムの演習
    • 特筆する問題はなかった

10. ファイル読込、文字操作

  • 10-1: ファイルの読み込み方法を学ぼう

    • 10-1-1: ファイルを読み込む

      • ※ここから下に書き写してください
        f = open('input/menu.csv', encoding='UTF-8')
        開いた内容を読み込む
        contents = f.read()
        表示する
        print(contents)
        ファイルを閉じる
        f.close()
    • 10-1-2: withキーワードで開く

      • ※ close() メソッドを書く必要がありません。
        with open('input/menu.csv', encoding="utf-8") as f:
        contents = f.read()
        print(contents)
  • 10-2: for文を使ってファイルを1行ずつ読み込む方法

    • 10-2-1 一行づつ読み込み

      • コード

        • with open('input/menu.csv', encoding='utf-8') as f:
          for row in f:
          print(row)
      • 解説

        • for 変数 in ファイルオブジェクト: と書くと、ファイル1行分ずつの文字列]に代入
    • 10-2-2 行末の改行を削除

      • list_strip/rstrip/lstrip

        • ...
      • コード

        • with open('input/menu.csv', encoding='utf-8') as f:
          for row in f:
          str_row = row.rstrip()
          print(str_row)
      • 解説

        • rstripメソッドについて
          文字列.rstrip() メソッドは文字列の末尾部分に存在する空白文字(半角スペース 、 全角スペース 、 タブ 、 改行 など)を取り去ります。
  • 10-3: 文字列.splitを使った文字列の分割方法

    • 1 問題

      • コード

        • sample = 'a,b,c,d,e'

          sample_list = sample.split(",")

          print(sample_list)

    • 2 問題

      • コード

        • num_string = '100 200 300 400 500'

          nums = num_string.split(" ")

          for x in nums:
          print(x)

    • 3 問題

      • コード

        • with open('input/menu.csv', encoding='utf-8') as f:
          for row in f:
          row_string = row.rstrip()
          columns = row_string.split(",")
          name = columns[0]
          price = columns1
          print(name + 'は' + price + '円')
      • 結果

        • コロッケ弁当は400円
          シャケ弁当は400円
          焼肉弁当は500円
          焼きそばは300円
          カレーライスは350円
          うな重は700円
          ビビンバ丼は600
      • 解説

        • 文字列の .split() メソッドを使って、メニューファイルの各行のデータを分解しました。
          各行はカンマ区切りの文字列なので、 row_string.split(',') を使って文字列リスト columns に変換しています。
          columns は以下のようなリストになります。
          columns = ["のり弁当", "350"]
          この columns リストから columns[0] や columns10 のように値(メニュー名と価格)を取り出しています。
          name = columns[0]
          price = columns10
  • 10-4: 読み込んだファイルの値をif文で判定しよう

      1. カラムの値を利用した計算

        • コード
        • print('<<2割引デー>>')
          with open('input/menu.csv', encoding='utf-8') as f:
          for row in f:
          columns = row.rstrip().split(',')
          name = columns[0]
          price = int(columns1)

          二割引きの計算(0.8倍して整数にする)
          new_price = int(price * 0.8)
          print(name, 'は', new_price, '円', sep='')

      • 結果

        • <<2割引デー>>
          唐揚げ弁当は320円
          とんかつ弁当は440円
          ハンバーグ弁当は400円
          のり弁当は280円
          シャケ弁当は320円
          焼肉弁当は400円
          うな重は560円
          ビビンバ丼は480円
      • 解説

        • ファイルから読み出したデータは文字列なので、ファイル内に書かれていた「400」のような数値も "400" のような 数字(string) となります。
          数値として計算するためには、一度 int() 関数を使って「数字(string)」=>「数値(integer)」と変換する必要があります。
          columnsには ["唐揚げ弁当", "400"] のような値が入っているので、 columns16 は文字列の "400" です。
          以下のプログラムではこの「唐揚げ弁当の値段==400」を数値に変換しています。
          price = int(columns16)
          2割引きなので、元の値段に 0.8(= 1 - 0.2) をかけると、値引き後の値段(new_price)になります。
          new_price = int(price 0.8) で int() に再度変換しているのは、数値 0.8 としたことで小数を含む数値(浮動小数点数)にPythonが変換するからです。
          ここでは小数点以下を切り捨てて数値(整数の数値)に変換するために再度 int() を使っています。
          new_price = int(price 0.8)
          コラム(四捨五入)
          new_price = int(price
          0.8) は、小数点以下を切り捨てます。
          小数点第一位で四捨五入をしたい場合は、下記のようにします。
          new_price = int(price * 0.8 + 0.5)
    • 3.丼演習 (ifでorを用いた複数条件指定

      • コード
        • if name == "ビビンバ丼" or name == "うな重":
  • 10-5: ファイルの読み込み、for文、if文や辞書を応用する演習

      1. お弁当の注文数を集計

        • コード
        • orders = {} # この行は直さないでください

          ‘# ファイルinput/lunch.csvを開いて、集計
          with open("input/lunch.csv", encoding="utf-8") as f:
          for row in f:
          row_str = row.rstrip().split(",")
          lunch = row_str1

              if lunch in orders:  
                  orders[lunch] += 1  
              else:  
                  orders[lunch] = 1  

          表示
          for menu_name, count in orders.items():
          print(menu_name + ':' + str(count))

11

  • 11-1: 現在の日付、時刻を取得しよう

      1. datetime
        • コード
        • from datetime import datetime
          now = datetime.now()
          print(now)
      • 期待値
        • 2019-01-10 13:16:48.904193
      • 解説

        • モジュール とは、importして呼び出すだけで便利に使える処理を集めたものです。
        • from datetime import datetime」は datetimeモジュール中のdatetimeクラスのみを利用する場合は、下記のように定義します。これはdatetimeモジュール中のdatetimeクラスを利用するという定義です。
        • importの使い分け

          • モジュールを使う場合、 import モジュール と書くことで利用できるようになります。
            import datetime
            print(datetime.datetime.now()) # 現在時刻表示

          • from モジュール import 対象クラス と書くと、 モジュール.対象クラス と書く代わりに単に対象クラス名をプログラムに書くだけで使えるようになります。
            from datetime import datetime
            print(datetime.now()) # 現在時刻表示
            プログラムの記述量を減らしたい場合は、 from を使うとよいでしょう。

      1. 年月日
        • コード
        • from datetime import datetime
          now = datetime.now()
          print(now.year,now.month,now.day, sep="/")
      1. 時分秒
        • コード
        • now = datetime.now()
          print(now.hour,"時")
          print(now.minute,"分")
          print(now.second,"秒")
  • 11-2: 日時の作成

      1. 指定の日のdatetimeオブジェクトを作成しよう

        • コード
        • from datetime import datetime

          one_day = datetime(2016,1,31)
          print(one_day)

      • 解説
        • datetime(年, 月, 日, 時, 分, 秒)と指定できます。時分秒を省略すると00:00:00となります。
        • datetime(年, 月, 日, 時, 分, 秒)の値の指定順は決まっています。
      1. 指定の日時のdatetimeオブジェクトを作成
        • コード
        • one_datetime = datetime(2016,5,5,14,15,30)
          print(one_datetime)
  • 11-3: 日時を文字列に変換

    • 1. 年月日の文字列

      • コード

        • one_day = datetime(2016, 8, 11)

          str_one_day = f'{one_day:%Y/%m/%d}'
          print(str_one_day)

      • 解説

        • f-stringsは、Python3.6から使えるようになったフォーマット済み文字列リテラル(formatted string literal)です。
          フォーマットは文字列中にフォーマット記号を指定し、一緒にその他の文字列も指定します。
          代表的なフォーマット記号は以下です。
          • %Y: 西暦(4桁)の10進表記を表します。
          • %m: 0埋めした10進数で表記した月。
          • %d: 0埋めした10進数で表記した月中の日にち。
          • %H: 0埋めした10進数で表記した時 (24時間表記)。
          • %M: 0埋めした10進数で表記した分。
          • %S: 0埋めした10進数で表記した秒。

        • その他のフォーマット指定については、「strftime() と strptime() の振る舞い」の表を参照ください。
          以下は、年月日を色々なフォーマットで表しています。
          print(f'{now:%Y/%m/%d}') # -> 2016/01/10
          print(f'{now:%Y-%m-%d}') # -> 2016-01-10
          print(f'{now:%Y年%m月%d日}') # -> 2016年01月10日

      1. 時分秒の文字列を表示

        • コード
        • one_day = datetime(2016, 5, 5, 14, 55, 22)

          str_time = f'{one_day:%H:%M:%S}'
          print(str_time)

      1. 日時の文字列を表示

        • コード
        • one_day = datetime(2015, 12, 31, 23, 55, 2)

          str_datetime = f'{one_day:%Y-%m-%d %H:%M:%S}'
          print(str_datetime)

  • 11-4: 文字列を日時に変換
    リンク: %20%E6%96%87%E5%AD%97%E5%88%97%E3%82%92%E6%97%A5%E6%99%82%E3%81%AB%E5%A4%89%E6%8F%9B

      1. 文字列を日付に変換

        • コード

        • str_date = '2016年12月31日'
          one_date = datetime.strptime(str_date, '%Y年%m月%d日')
          print(one_date)

          • strpはstring pointer か?諸説あるらしい
        • 解説

        • • strptime() : 文字列から日時への変換
          文字列を指定したフォーマットで日時に変換します。

        • strftime() と strptime() の振る舞い」の表を参照ください。

    • 2 文字列を日付に変換
      • コード
        • str_day = '2016/01/15 09:15:31'
          one_day = datetime.strptime(str_day, '%Y/%m/%d %H:%M:%S')
          print(one_day)
  • 11-5: 日時の差分(何日前、何日後)を計算

      1. 2日前の日付を表示

        • コード
        • from datetime import datetime
          from datetime import timedelta

          olympic_day = datetime(2020, 7, 24)
          before_2days = olympic_day - timedelta(days=2)
          ‘# 表示
          print(before_2days.date())

      • 解説

        • timedeltaは日付や時間の計算に使います。
          timedelta(days=3)は3日分を表します。nowに足すと3日後、引くと3日前になります。

          • from datetime import datetime, timedelta
            now = datetime.now()

            before_3days = now - timedelta(days=3) # 3日前
            after_3days = now + timedelta(days=3) # 3日後

      1. 20日後の日付

        • コード
        • from datetime import datetime
          from datetime import timedelta

          one_day = datetime(2016, 12, 31)
          after_20days = one_day + timedelta(days=20)
          ‘# 表示
          print(after_20days.date())
          print(after_20days - one_day)
          print(after_20days > one_day)

      • 解説

        • • 日付時刻オブジェクトにtimedeltaオブジェクトを足すと、その時間を足した日付時刻オブジェクトになります。
          ◦ one_day + timedelta(days=20)で、one_dayの20日後になります。
          • 日付時刻オブジェクトから日付時刻オブジェクトを引くと、差はtimedeltaオブジェクトになります。
          ◦ after_20days - one_dayは、20日を表すtimedeltaオブジェクトになります。
          • 日付時刻オブジェクト同士は、数字のように比較できます。
          ◦ after_20daysはone_dayより未来なので、after_20days > one_dayはTrueになります。
          ※ 日付時刻オブジェクト同士の比較演算として、 <, <=, >, >=, ==, != が使えます。

        • timedeltaを利用すると、年や月を気にせずに日付を計算できます。

  • 11-6: 日時の使い方、文字列との変換、日時の比較をする演

12

  • 12-1: open()関数を使ってファイルへ出力しよう

    • 1 ファイルへの書き込み

      • コード

        • ポイント
          • ファイルへの書き込み
            • open(‘...txt’, ‘w’....)
        • with open('output/output.txt', 'w', encoding='utf-8') as f:
          f.write("hello, world\n")
          print('書き込み完了')
      • 解説

        • ファイルを開くモード
          • ファイルを開くときに指定するモードには以下の種類があります。
            • • r: 読み込み専用。省略可能。
            • • w: 書き込みするときに指定。ファイルが存在しない場合、新しいファイルが作られる。
            • • x: ファイルが存在しない場合のみ、ファイルを作成し、書き込む。ファイルが存在する場合は何もしない。
            • • a: 末尾に書き込み。ファイルが存在しない場合はファイルを作成し、書き込む。
    • ループを利用してファイルに出力しよう

      • コード

        • week_duty = ['月曜日は木田',
          '火曜日は西川',
          '水曜日は大村',
          '木曜日は岡田',
          '金曜日は中村']
          with open('output/trash.txt', 'w', encoding='utf-8') as f:
          for item in week_duty:
          f.write(item + '\n')
          print('書き込み完了')

        • ポイント

          • 改行
      • 解説
        • for文 を利用してリストの要素を1行に1要素ずつ書き込んでいます。 write() は print() 関数のように改行文字を行の末尾に自動で追加しないので、改行したい場合は \n を忘れないようにしましょう。
    • 3 辞書からテキストファイルへ書き込み

      • コード

        • ポイント
          • 文字列への変換
            • str(now)
          • 辞書からのfor文でのkey、値取得
            • dictionary.items()
          • 改行
            • ‘\n’
        • stationery = {'ボールペン': 22,
          'ノート': 31,
          'のり': 8,
          'セロハンテープ': 24,
          'ホッチキス': 7
          }

          with open('output/stationery.txt', 'w', encoding='utf-8') as f:
          for key, value in stationery.items():
          f.write(key + 'は' + str(value))
          f.write('\n')

          print('書き込み完了')

      • 解説

        • 辞書.items() を使うと、繰り返しの中で、キーと値のペアを取得できます。キーは変数 key 、値は変数 value に代入されます。
  • 12-2: 日時をファイルへ出力しよう

    • 出勤時刻をファイルに出力しよう (追記)

      • コード

        • ポイント
          • 追記(append)
            • open(‘...txt’, ‘a’...)
        • from datetime import datetime

          now = datetime.now()
          str_now = f'{now:%Y/%m/%d %H:%M}'
          with open('output/work.log', 'a', encoding='utf-8') as f:
          f.write(str_now + " - 出勤\n")
          print('書き込み完了')

      • 解説

        • open(ファイルパス, 'a') と、 open() に 'a' をつけると、ファイルの末尾に追加して書き込みます。
          'w' を指定した場合はファイルの書かれていた内容は上書きされ、消えてしまいます。
    • 2 出退勤時刻をファイルに出力しよう

      • コード

        • ポイント
          • 時刻から時間のみ抜き出す
            • now.hour
        • from datetime import datetime

          now = datetime.now()
          str_now = f'{now:%Y/%m/%d %H:%M}'
          with open('output/attendance.log', 'a', encoding='utf-8') as f:
          if 6 <= now.hour < 14:
          f.write(str_now + " - 出勤\n")
          else:
          f.write(str_now + " - 退勤\n")
          print('書き込み完了')

  • 12-3 追加演習_ 出退勤時刻をファイルに出力するプログラム

    • 1

      • コード

        • from datetime import datetime

          ‘# 現在の時刻を取得し、文字列に変換
          now = datetime.now()
          str_now = f'{now:%Y/%m/%d %H:%M:%S}'

          ‘# 出勤時間か、退勤時間かを判定
          if 7 <= now.hour < 12:
          action = '出勤'
          else:
          action = '退勤'

          ‘# 出力文字列作成
          write_string = str_now + ' - ' + action + '\n'
          print(write_string)

          with open('output/timecard.log', 'a', encoding='utf-8') as f:
          f.write(write_string)

    • 2

      • コード
        • working_day = ['2016-07-11',
          '2016-07-12',
          '2016-07-13',
          '2016-07-14',
          '2016-07-15']
          with open('output/working_days.log', 'w', encoding='utf-8') as f:
          for day in working_day:
          f.write(day)
          f.write('\n')
          print('書き込み完了')

13 はじめの総合演習

  • 13-1: print()、変数の総合演習

    • 1
  • 13-2: 計算とif文の条件分岐を応用した総合演習

    • 2

      • ポイント
        • 商|割り算(小数点以下切り捨て)
          • print(13//5) -> 2
        • 商|割り算(余り)
          • print(13%5)
      • コード

        • import random # 書き換え不可

          ‘# 1ダースの本数
          dozen = 12
          ‘# 注文希望本数
          order = random.choice([144, 145]) # 書き換え不可
          print('注文希望本数:', order, sep='')

          ‘# 注文ダース数計算
          order_dozen = order // dozen
          ‘# 余りの計算
          amari = order % dozen

          ‘# 注文ダース数を表示
          print(order_dozen, 'ダース注文します。', sep='')

          ‘# 余りがある場合はその本数を表示
          if amari != 0:
          print('あと', dozen - amari, '本で、もう1ダース注文できます。', sep='')

  • 13-3: リスト、for文の総合演習

    • 2

      • ポイント
        • リスト操作
          • 末尾に追加
            • duty.append(‘山田’)
          • 挿入
            • duty.insert(2,’中村’)
          • 変更
            • duty1 = ‘西川’
          • 削除
            • duty.pop(0)
      • コード

        • ‘# 当番社員リスト
          duty = ['伊藤', '清水', '遠藤', '川島']

          ‘# 初期状態を表示
          for employee in duty:
          print(employee)

          ‘# 追加(末尾)
          duty.append('山田')
          print('++ 末尾に「山田」を追加 ++')

          ‘# 追加(3番目)
          print('++ 前から3番目に「中村」を追加 ++')
          duty.insert(2,'中村')

          ‘# 変更(2番目)
          print('++ 前から2番目を「西川」に変更 ++')
          duty1='西川'
          ‘# 削除(1番目)
          print('++ 前から1番目の社員を削除 ++')
          duty.pop(0)

    • 3

      • リスト操作
        • 末尾の要素の削除
          • fruit_line.pop()
        • 先頭の果物を取り出して、末尾に移動しました。
          • last_fruit = fruit_line.pop(0)
            fruit_line.append(last_fruit)
  • 13-4: 辞書の総合演習

    • 1 健康診断結果を扱うプログラム

      • ポイント

        • 辞書を作成し、キーと値を追加

          • health_result={}
            ‘# 身長、体重の表示
            health_result['名前']='佐藤'
        • 辞書のprint

          • print(health_result['名前'],'さん(',health_result['年齢'],')の',sep="")
      • コード
        • ‘# 辞書health_resultを作成
          health_result={}
          ‘# 身長、体重の表示
          health_result['名前']='佐藤'
          health_result['年齢']=35
          print(health_result['名前'],'さん(',health_result['年齢'],')の',sep="")
    • 2 文房具の在庫を修正

      • ポイント
        • 辞書の値の書き換え
          • stationery['えんぴつ'] = 20
        • 辞書のキーと値の削除
          • del stationery[‘のり’]
      • コード

        • stationery = {'ボールペン': 22,
          'ノート': 31,
          'のり': 8,
          'えんぴつ': 24}

          ‘# 在庫項目の追加
          stationery['消しゴム'] = 10
          ‘# 在庫の変更
          stationery['えんぴつ'] = 20
          ‘# 在庫項目の削除
          del stationery['のり']

  • 13-5: ファイルの読み込み、for文、if文を応用する総合演習

    • 1 お弁当の注文ファイルの読み込み

      • ポイント

        • ファイルを一行づつ読み込み

          • with open('input/lunch.csv', encoding='utf-8') as file:
            for row in file:
        • 末尾の空白文字を削除

          • columns = row.rstrip().split(',')
      • コード

        • with open('input/lunch.csv', encoding='utf-8') as f:
          for row in f:
          columns = row.rstrip().split(',')
          name = columns[0]
          lunch = columns1

              if lunch == 'コロッケ弁当':  
                  print(name)  
    • 2 会議室予約ファイルの読み込み

      • ポイント
        • リストに存在するか?
          • if name not in book_user:
      • コード
        • book_user = []
          with open('input/room.csv', encoding = 'utf-8') as f:
          for row in f:
          columns = row.rstrip().split(',')
          room = columns[0]
          name = columns1
          if room == '会議室A':
          if name not in book_user:
          book_user.append(name)
  • 13-6: ファイルへの書き込み、読み込みの総合演習

    • 1 果物一覧をファイルに出力しよう

      • ポイント

        • ファイルへの書き込みと改行
          • with open('output/fruit.txt', 'w', encoding = 'utf-8') as f:
            f.write(item +’ \n’)
      • コード

        • fruit_list = ['りんご', 'みかん', 'ぶどう', 'もも', 'バナナ', 'きんかん']
          with open('output/fruit.txt', 'w', encoding = 'utf-8') as f:
          for item in fruit_list:
          f.write(item)
          f.write('\n')
    • 2 条件と一致する行を出力しよう

      • ポイント
        • リストに値を追加
          • row_output.append(row)
      • コード

        • row_output = []

          with open("input/books.csv", encoding = 'utf-8') as f:
          for row in f:
          columns = row.strip().split(",")
          purpose = columns2
          if purpose == "Python-勉強会":
          row_output.append(row)
          with open('output/book_python.csv','w',encoding='utf-8') as fw:
          for row in row_output:
          fw.write(row)

  • 13-7: 日時、文字列との変換の総合演習

    • 1 5日前の日付を表示するプログラム

      • コード

        • from datetime import datetime
          from datetime import timedelta

          ‘# 指定日
          str_date = '2016-10-20'

          ‘#★文字列を 日付へ変換
          base_time = datetime.strptime(str_date, '%Y-%m-%d')
          ’# 5日前
          five_days_ago = base_time - timedelta(days=5)
          ‘# ★文字列に変換
          print_date = f'{five_days_ago:%Y-%m-%d}'
          ’# 表示
          print(print_date)

      1. ファイルを読み込んで日時に変換

        • コード
        • from datetime import datetime

          with open('input/days.txt', encoding='utf-8') as f:
          for row in f:
          'strptimeで文字列を日付に変換。rstripで文末の空白等を削除
          base_date = datetime.strptime(row.rstrip(),'%Y-%m-%d')
          str_date = f'{base_date:%Y/%m/%d}'
          print(str_date)

      1. ファイルを読み込んで、指定の5日間の日付を表示

        • コード
        • from datetime import datetime
          from datetime import timedelta

          ‘# 基準の日付
          str_date = '2016-10-20'
          ‘# 文字列を日付へ変換
          base_day = datetime.strptime(str_date, '%Y-%m-%d')
          ‘# 5日前の日付 (差分)
          five_days_ago = base_day - timedelta(days=5)
          ‘# ファイルinput/days.txtを開く
          with open('input/days.txt', encoding='utf-8') as f:
          for row in f:
          ‘# 文字列を日付へ変換
          day = datetime.strptime(row.rstrip(),'%Y-%m-%d')
          ‘# 日付を比較 ★比較演算子:「以上」
          if five_days_ago <= day < base_day:
          print(f'{day:%Y/%m/%d}')

  • 13-8: ファイル読み込み、for文、if文と辞書を応用した集計の総合演習

      1. お弁当の注文数を集計するプログラム

        • ...
        • ...
        • orders = {} # この行は直さないでください

        ‘# ファイルinput/lunch.csvを開いて、集計
        with open('input/lunch.csv',encoding='utf-8') as f:
        for row in f:
        末尾の空白削除 => strip
        columns = row.rstrip().split(',')
        name = columns[0]
        lunch = columns1
        if lunch in orders:
        orders[lunch] += 1
        else:
        orders[lunch] = 1
        ‘# 表示
        print(orders)

      1. 会議室の予約数を集計するプログラム

14 はじめのチャレンジ

    1. 1〜10までの総和
      • ‘# 問題:1〜10まで繰り返して、その合計数を表示して下さい
        sample_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
        ‘#★変数のスコープ、ブロックの外で使うには?
        total = 0
        for item in sample_list:
        ‘#★変数を用いたインクリメント
        total += item
        print(total)
    1. 世界のナベアツ
      • ’# 問題:let's ナベアツ
        sample_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
        for num in sample_list:
        ’#★数値に"3"が含まれるか判定する
        if num % 3 == 0 or '3' in str(num):
        print("アホ")
        else:
        print(num)
  • 14-3: チャレンジ!ファイル読み込みと日時処理

      1. 今月の予約状況の表示

        • """今月の予約一覧を表示."""

        from datetime import datetime

        now = datetime.now()

        '# ファイルの読み込み
        with open('input/books.csv', encoding='utf-8') as f:
        for row in f:
        data = row.rstrip().split(',')
        book_date = datetime.strptime(data[0], '%Y-%m-%d') '# 利用日
        purpose = data2 '# 会議室の利用目的

            '# 今月分だけ表示(★日付型から年の取得、月の取得)  
            if book_date.year == now.year and book_date.month == now.month:  
                view_date = f'{book_date:%m/%d}'  '# 日付の整形  
                print(view_date + ':' + purpose)  '# 表示  
    • 2 過去100日間の会議室の利用目的別の集計

      • """過去100日間の会議室の利用目的別の集計."""
        from datetime import datetime, timedelta

        PERIOD_DAYS = 100

        ‘# キーに「会議室の利用目的」、バリューに利用回数の合計を入れて計算する
        purpose_count = {}

        now = datetime.now()
        today = datetime(now.year, now.month, now.day) # 本日の0:00:00時点の日付
        agg_since_date = now - timedelta(days=PERIOD_DAYS) # 今から PERIOD_DAYS 前の日時

        ‘# ファイルの読み込み
        with open('./input/books.csv', encoding='utf-8') as f:
        for row in f:
        columns = row.strip().split(',')
        date_str = columns[0] # 日付
        purpose = columns2 # 会議室の利用目的

            reservation_date = datetime.strptime(date_str, '%Y-%m-%d')  

        利用された日付がPERIOD_DAYS前の日時以上、今現在未満であれば集計対象
        if agg_since_date <= reservation_date < today:
        if purpose in purpose_count:
        purpose_count[purpose] += 1
        else:
        purpose_count[purpose] = 1

        ‘# ファイルに書き込み
        with open('./output/count_purpose.csv', 'w', encoding='utf-8') as f:
        for purpose, count in purpose_count.items():
        f.write(purpose + "," + str(count) + "\n")

  • 14-4: チャレンジ!ファイル読み込みと集計処理

15

  • 15-1: おみくじを作ろう

73. Jupyter Notebookの使い方

Jupyter Notebook

  • 対話式にコードを実行できる
  • 実行したコードと実行結果を合わせたファイル、 ノートブック を生成
  • ノートブックファイルはEメール、Dropbox、GitHubなどで共有することにより、コードと実行結果を他者と共有
  • 実行:[Shift]キー+[Enter]
  • Jupyter Notebookprint()関数を書かなくても、セルの一番最後に書いた変数の値を表示します。
  • セルの中でインラインでメソッドのヘルプを確認
    • [Shift]キー+[Tab]キー
      • 2回連続=>詳しい説明
    • 前のクエスチョンのNotebookを取り込んで実行
      • %run 1.ipynb

73-2: Jupyter Notebookでのモジュールの使い方を学ぼう

  • いちどimportしたモジュールは違うセルでも利用できます

73-3: Jupyter Notebookでの関数の使い方を学ぼう

73-4: Jupyter Notebookのメニューの使い方を学ぼう

  • コマンドモードショートカット
    • • 保存(s)
    • • 直下に新規のセルを増やす(b)
    • • セルの切り取り(x)
    • • セルのコピー(c)
    • • セルのペースト(v)
  • 数式の記述
    • • $数式$:インライン数式(文中に埋め込まれます)
      • $$数式$$:ディスプレイ数式(別の行になります)

73-5: Jupyter Notebookのグラフ描画とマジックコマンド

  • 1 グラフを表示

    • %matplotlib inline
      import matplotlib.pyplot as plt
      plt.title('Test Graph') #title
      plt.plot([1,2,3,4]); #折れ線グラフの出力
  • 2 マジックコマンド

    • • %コマンド:ラインマジックコマンドといいます。1行からなるコマンドです。
    • • %%コマンド:セルマジックコマンドといいます。1セルからなるコマンドです。
  • 3 変数保存

    • マジックコマンドで変数保存

      • 変数aをJupyterのDBに保存
        a = 20
        %store a

      • 保存されている変数の一覧
        %store

      • del a #変数aを削除
        try:
        print(a)
        except NameError as e:
        print(e)

      • aを戻す
        %store -r
        print(a)

      • ...

      • JupyterのDBのデータは、~/.ipython/profile_default/db/autorestoreフォルダに変数名のファイルで保存されます。中味はpickle形式です。

      • pickle形式は、pickleライブラリーでサポートされているPython固有のバイナリー形式です。高速に読み書きできます。

      • Pythonの実行環境と「JupyterのDB」は別々に管理されます。

      • コードのようにdel aとすることで、Pythonの実行環境から変数aを削除します。これにより、変数aが存在しなくなります。ただし、JupyterのDBは無関係なので、%store -rとすることで変数aを再度、利用できるようになります。

      • open関数の'wb'モードと'rb'モード

        • データを単なる数字の連続データとみなしたとき、そのデータのことを、バイナリー形式のデータといいます。コンピューターの内部ではデータを0と1を用いているため、バイナリー(binary)という言い方をします。
        • open関数の第2引数の'wb'は、バイナリーの書き込みモードを指定しています。
        • open関数の第2引数の'rb'は、バイナリーの読み込みモードを指定しています。
        • pickleを使う場合は、バイナリーの指定が必要です。

Python機械学習初級

100. はじめての機械学習

  • 1: 機械学習の基本をif文から学ぼう

misc

sleep

  • import time
    time.sleep(秒数)

ディレクトリ作成

新規作成専用でファイルオープン: mode='x'

google drive mounte@colaboratory

ファイル名を日付に

1章 ウェブの注文数を分析する10本

ここでは、ある企業のECサイトでの商品の注文数の推移を分析していきます。
データの属性を理解し、分析をするためにデータを加工した後、
データの可視化を行うことで問題を発見していくプロセスを学びます。

1:データを読み込んでみよう

Q. pandasのインポート


import pandas as pd

Q. customer_master.csvをcustomer_masterに格納し冒頭五行を表示


customer_master = pd.read_csv("customer_master.csv")
customer_master.head(5)
customer_id customer_name registration_date customer_name_kana email gender age birth pref
0 IK152942 平田 裕次郎 2019-01-01 00:25:33 ひらた ゆうじろう hirata_yuujirou@example.com M 29 1990/6/10 石川県
1 TS808488 田村 詩織 2019-01-01 01:13:45 たむら しおり tamura_shiori@example.com F 33 1986/5/20 東京都
2 AS834628 久野 由樹 2019-01-01 02:00:14 ひさの ゆき hisano_yuki@example.com F 63 1956/1/2 茨城県
3 AS345469 鶴岡 薫 2019-01-01 04:48:22 つるおか かおる tsuruoka_kaoru@example.com M 74 1945/3/25 東京都
4 GD892565 大内 高史 2019-01-01 04:54:51 おおうち たかし oouchi_takashi@example.com M 54 1965/8/5 千葉県

Q. item_master.csvをitem_masterに格納し冒頭五行を表示

item_master = pd.read_csv("item_master.csv")
item_master.head(5)
item_id item_name item_price
0 S001 PC-A 50000
1 S002 PC-B 85000
2 S003 PC-C 120000
3 S004 PC-D 180000
4 S005 PC-E 210000

transaction_1csvをtransaction_1に格納し冒頭五行を表示

transaction_1 = pd.read_csv("transaction_1.csv")

transaction_1.head()
transaction_id price payment_date customer_id
0 T0000000113 210000 2019-02-01 01:36:57 PL563502
1 T0000000114 50000 2019-02-01 01:37:23 HD678019
2 T0000000115 120000 2019-02-01 02:34:19 HD298120
3 T0000000116 210000 2019-02-01 02:47:23 IK452215
4 T0000000117 170000 2019-02-01 04:33:46 PL542865

transaction_detail_1.csvをtransaction_detail_1格納し冒頭五行を表示

transaction_detail_1 = pd.read_csv("transaction_detail_1.csv")

transaction_detail_1.head(5)
detail_id transaction_id item_id quantity
0 0 T0000000113 S005 1
1 1 T0000000114 S001 1
2 2 T0000000115 S003 1
3 3 T0000000116 S005 1
4 4 T0000000117 S002 2

2:データを結合(ユニオン)してみよう

transaction_2.csvをtransaction_2格納し冒頭五行を表示

transaction_2 = pd.read_csv("transaction_2.csv")

Q. transaction_1と2を結合しtransactionに格納し冒頭五行を表示

transaction = pd.concat([transaction_1,transaction_2],ignore_index=True)
transaction.head(5)
transaction_id price payment_date customer_id
0 T0000000113 210000 2019-02-01 01:36:57 PL563502
1 T0000000114 50000 2019-02-01 01:37:23 HD678019
2 T0000000115 120000 2019-02-01 02:34:19 HD298120
3 T0000000116 210000 2019-02-01 02:47:23 IK452215
4 T0000000117 170000 2019-02-01 04:33:46 PL542865

Q. transaction_1と2とtransactionの長さを表示

print(len(transaction_1))
print(len(transaction_2))
print(len(transaction_1)+len(transaction_2))
print(len(transaction))
5000
1786
6786
6786

transaction_detail_2.csvをtransaction_detail_2格納し冒頭五行を表示

transaction_detail_2 = pd.read_csv("transaction_detail_2.csv")
transaction_detail_2.head(5)
detail_id transaction_id item_id quantity
0 5000 T0000004870 S002 3
1 5001 T0000004871 S003 1
2 5002 T0000004872 S001 2
3 5003 T0000004873 S004 1
4 5004 T0000004874 S003 2

Q. transaction_detail_1と2を結合しtransaction_detailに格納し冒頭五行を表示


transaction_detail = pd.concat([transaction_detail_1,transaction_detail_2],ignore_index=True)
transaction_detail.head(5)
detail_id transaction_id item_id quantity
0 0 T0000000113 S005 1
1 1 T0000000114 S001 1
2 2 T0000000115 S003 1
3 3 T0000000116 S005 1
4 4 T0000000117 S002 2

Q. transaction_detail_1と2の合計がtransaction_detailの総数と合致することをprint無しで一行で表示


len(transaction_detail_1)+len(transaction_detail_2)==len(transaction_detail)
True

3:売上データ同士を結合(ジョイン)してみよう

Q. transaction_detailとtransactionを横結合しjoin_dataに格納

  • transaction_detailは全列
  • transaction:"transaction_id","payment_date","customer_id"
  • transaction_idで結合
  • left

image.png

'マージ|結合
join_data = pd.merge(transaction_detail,transaction[["transaction_id","payment_date","customer_id"]], on="transaction_id", how="left")
join_data.head()
detail_id transaction_id item_id quantity payment_date customer_id
0 0 T0000000113 S005 1 2019-02-01 01:36:57 PL563502
1 1 T0000000114 S001 1 2019-02-01 01:37:23 HD678019
2 2 T0000000115 S003 1 2019-02-01 02:34:19 HD298120
3 3 T0000000116 S005 1 2019-02-01 02:47:23 IK452215
4 4 T0000000117 S002 2 2019-02-01 04:33:46 PL542865

4:マスタデータを結合(ジョイン)してみよう

Q. join_dataとcustomer_masterを横結合しjoin_dataに格納

  • join_dataは全列
  • customer_master:"customer_id"
  • customer_idで結合
  • left

#横結合|マージ
join_data=pd.merge(join_data,customer_master,on="customer_id",how="left")
join_data.head(5)
detail_id transaction_id item_id quantity payment_date customer_id customer_name_x registration_date_x customer_name_kana_x email_x ... price payment_month customer_name_y registration_date_y customer_name_kana_y email_y gender_y age_y birth_y pref_y
0 0 T0000000113 S005 1 2019-02-01 01:36:57 PL563502 井本 芳正 2019-01-07 14:34:35 いもと よしまさ imoto_yoshimasa@example.com ... 210000 201902 井本 芳正 2019-01-07 14:34:35 いもと よしまさ imoto_yoshimasa@example.com M 30 1989/7/15 熊本県
1 1 T0000000114 S001 1 2019-02-01 01:37:23 HD678019 三船 六郎 2019-01-27 18:00:11 みふね ろくろう mifune_rokurou@example.com ... 50000 201902 三船 六郎 2019-01-27 18:00:11 みふね ろくろう mifune_rokurou@example.com M 73 1945/11/29 京都府
2 2 T0000000115 S003 1 2019-02-01 02:34:19 HD298120 山根 小雁 2019-01-11 08:16:02 やまね こがん yamane_kogan@example.com ... 120000 201902 山根 小雁 2019-01-11 08:16:02 やまね こがん yamane_kogan@example.com M 42 1977/5/17 茨城県
3 3 T0000000116 S005 1 2019-02-01 02:47:23 IK452215 池田 菜摘 2019-01-10 05:07:38 いけだ なつみ ikeda_natsumi@example.com ... 210000 201902 池田 菜摘 2019-01-10 05:07:38 いけだ なつみ ikeda_natsumi@example.com F 47 1972/3/17 兵庫県
4 4 T0000000117 S002 2 2019-02-01 04:33:46 PL542865 栗田 憲一 2019-01-25 06:46:05 くりた けんいち kurita_kenichi@example.com ... 170000 201902 栗田 憲一 2019-01-25 06:46:05 くりた けんいち kurita_kenichi@example.com M 74 1944/12/17 長崎県

5 rows × 26 columns

join_data=pd.merge(join_data,item_master,on="item_id",how="left")
join_data.head(5)
detail_id transaction_id item_id quantity payment_date customer_id customer_name registration_date customer_name_kana email gender age birth pref item_name item_price
0 0 T0000000113 S005 1 2019-02-01 01:36:57 PL563502 井本 芳正 2019-01-07 14:34:35 いもと よしまさ imoto_yoshimasa@example.com M 30 1989/7/15 熊本県 PC-E 210000
1 1 T0000000114 S001 1 2019-02-01 01:37:23 HD678019 三船 六郎 2019-01-27 18:00:11 みふね ろくろう mifune_rokurou@example.com M 73 1945/11/29 京都府 PC-A 50000
2 2 T0000000115 S003 1 2019-02-01 02:34:19 HD298120 山根 小雁 2019-01-11 08:16:02 やまね こがん yamane_kogan@example.com M 42 1977/5/17 茨城県 PC-C 120000
3 3 T0000000116 S005 1 2019-02-01 02:47:23 IK452215 池田 菜摘 2019-01-10 05:07:38 いけだ なつみ ikeda_natsumi@example.com F 47 1972/3/17 兵庫県 PC-E 210000
4 4 T0000000117 S002 2 2019-02-01 04:33:46 PL542865 栗田 憲一 2019-01-25 06:46:05 くりた けんいち kurita_kenichi@example.com M 74 1944/12/17 長崎県 PC-B 85000

5:必要なデータ列を作ろう

Q. 列を追加(quantity*item_price -> price列)


#列追加
join_data["price"]=join_data["quantity"]*join_data["item_price"]
join_data[["quantity","item_price","price"]].head(5)
quantity item_price price
0 1 210000 210000
1 1 50000 50000
2 1 120000 120000
3 1 210000 210000
4 2 85000 170000
join_data.head(1)
detail_id transaction_id item_id quantity payment_date customer_id customer_name registration_date customer_name_kana email gender age birth pref item_name item_price price
0 0 T0000000113 S005 1 2019-02-01 01:36:57 PL563502 井本 芳正 2019-01-07 14:34:35 いもと よしまさ imoto_yoshimasa@example.com M 30 1989/7/15 熊本県 PC-E 210000 210000

6:データ検算をしよう

Q. join_dataとtransactionのpriceの合計をそれぞれ表示


print(join_data["price"].sum())
print(transaction["price"].sum())
join_data["price"].sum()==transaction["price"].sum()
971135000
971135000

True

7:各種統計量を把握しよう

Q.欠損値の合計を表示


#欠損値
join_data.isnull().sum()
detail_id             0
transaction_id        0
item_id               0
quantity              0
payment_date          0
customer_id           0
customer_name         0
registration_date     0
customer_name_kana    0
email                 0
gender                0
age                   0
birth                 0
pref                  0
item_name             0
item_price            0
price                 0
dtype: int64

各種統計量 (std=標準偏差、四分位数(シブンイスウ))

image.png

join_data.describe()
detail_id quantity age item_price price
count 7144.000000 7144.000000 7144.000000 7144.000000 7144.000000
mean 3571.500000 1.199888 50.265677 121698.628219 135937.150056
std 2062.439494 0.513647 17.190314 64571.311830 68511.453297
min 0.000000 1.000000 20.000000 50000.000000 50000.000000
25% 1785.750000 1.000000 36.000000 50000.000000 85000.000000
50% 3571.500000 1.000000 50.000000 102500.000000 120000.000000
75% 5357.250000 1.000000 65.000000 187500.000000 210000.000000
max 7143.000000 4.000000 80.000000 210000.000000 420000.000000

payment_dateカラムの値で集計範囲を確認


print(join_data["payment_date"].min()) #最小
print(join_data["payment_date"].max()) #最大
2019-02-01 01:36:57
2019-07-31 23:41:38

payment_dateカラムの値で集計範囲を確認

8:月別でデータを集計してみよう

join_dataの各カラムのデータ型を確認


join_data.dtypes #データ型の確認
detail_id              int64
transaction_id        object
item_id               object
quantity               int64
payment_date          object
customer_id           object
customer_name         object
registration_date     object
customer_name_kana    object
email                 object
gender                object
age                    int64
birth                 object
pref                  object
item_name             object
item_price             int64
price                  int64
dtype: object

Q.payment_dateをdatetime型に変換


#datetime型に変換
join_data["payment_date"] = pd.to_datetime(join_data["payment_date"])

Q.payment_dateを年/月で文字列に変換し、payment_monthへ格納


join_data["payment_month"]=join_data["payment_date"].dt.strftime("%Y%m")
#strftime(): 日付、時間から文字列への変換 (dtはdatetime)
#※strptime(): 文字列から日付、時間への変換

payment_dateとpayment_monthの五行目を表示payment_dateを年/月で文字列に変換し、payment_monthへ格納


#年/月で文字列に変換
join_data[["payment_date","payment_month"]].head(5)
payment_date payment_month
0 2019-02-01 01:36:57 201902
1 2019-02-01 01:37:23 201902
2 2019-02-01 02:34:19 201902
3 2019-02-01 02:47:23 201902
4 2019-02-01 04:33:46 201902

Q.payment_monthでグループ化し、合計を表示

image.png


#payment_monthでグループ化し、合計を表示
join_data.groupby("payment_month").sum()
detail_id quantity age item_price price
payment_month
201902 676866 1403 59279 142805000 160185000
201903 2071474 1427 58996 142980000 160370000
201904 3476816 1421 59246 143670000 160510000
201905 4812795 1390 58195 139655000 155420000
201906 6369999 1446 61070 147090000 164030000
201907 8106846 1485 62312 153215000 170620000

上記グループ化でpriceのみを表示


#上記グループ化でpriceのみを表示
join_data.groupby("payment_month").sum()["price"]
payment_month
201902    160185000
201903    160370000
201904    160510000
201905    155420000
201906    164030000
201907    170620000
Name: price, dtype: int64

9:月別、商品別でデータを集計してみよう

月別payment_month、商品別item_nameでデータをグループ化、priceとquantityの合計


#月別payment_month、商品別item_nameでデータをグループ化、priceとquantityの合計
join_data.groupby(["payment_month", "item_name"]).sum()[["price","quantity"]]
price quantity
payment_month item_name
201902 PC-A 24150000 483
PC-B 25245000 297
PC-C 19800000 165
PC-D 31140000 173
PC-E 59850000 285
201903 PC-A 26000000 520
PC-B 25500000 300
PC-C 19080000 159
PC-D 25740000 143
PC-E 64050000 305
201904 PC-A 25900000 518
PC-B 23460000 276
PC-C 21960000 183
PC-D 24300000 135
PC-E 64890000 309
201905 PC-A 24850000 497
PC-B 25330000 298
PC-C 20520000 171
PC-D 25920000 144
PC-E 58800000 280
201906 PC-A 26000000 520
PC-B 23970000 282
PC-C 21840000 182
PC-D 28800000 160
PC-E 63420000 302
201907 PC-A 25250000 505
PC-B 28220000 332
PC-C 19440000 162
PC-D 26100000 145
PC-E 71610000 341
#上記グループ化でpriceのみを表示
join_data.groupby("payment_month").sum()["price"]
payment_month
201902    160185000
201903    160370000
201904    160510000
201905    155420000
201906    164030000
201907    170620000
Name: price, dtype: int64

Qピボットテーブル

image.png


#ピボットテーブル
pd.pivot_table(join_data, index='item_name', columns='payment_month', values=['price', 'quantity'], aggfunc='sum')
price quantity
payment_month 201902 201903 201904 201905 201906 201907 201902 201903 201904 201905 201906 201907
item_name
PC-A 24150000 26000000 25900000 24850000 26000000 25250000 483 520 518 497 520 505
PC-B 25245000 25500000 23460000 25330000 23970000 28220000 297 300 276 298 282 332
PC-C 19800000 19080000 21960000 20520000 21840000 19440000 165 159 183 171 182 162
PC-D 31140000 25740000 24300000 25920000 28800000 26100000 173 143 135 144 160 145
PC-E 59850000 64050000 64890000 58800000 63420000 71610000 285 305 309 280 302 341

10:商品別の売上推移を可視化してみよう

Q.ピボットテーブル2 (graph_dataにピボットを格納>冒頭を表示

image.png


#ピボットテーブル
graph_data = pd.pivot_table(join_data, index='payment_month', columns='item_name', values='price', aggfunc='sum')
graph_data.head()
item_name PC-A PC-B PC-C PC-D PC-E
payment_month
201902 24150000 25245000 19800000 31140000 59850000
201903 26000000 25500000 19080000 25740000 64050000
201904 25900000 23460000 21960000 24300000 64890000
201905 24850000 25330000 20520000 25920000 58800000
201906 26000000 23970000 21840000 28800000 63420000

Q. graph_dataをグラフで表示

  • payment_monthをデータグレーム型のindexとして横軸に
    image.png
import matplotlib.pyplot as plt
%matplotlib inline
plt.plot(list(graph_data.index),graph_data["PC-A"], label='PC-A')
plt.plot(list(graph_data.index), graph_data["PC-B"], label='PC-B')
plt.plot(list(graph_data.index), graph_data["PC-C"], label='PC-C')
plt.plot(list(graph_data.index), graph_data["PC-D"], label='PC-D')
plt.plot(list(graph_data.index), graph_data["PC-E"], label='PC-E')
plt.legend() #凡例の表示

png

投稿フッター
  • このエントリーをはてなブックマークに追加
  • Evernoteに保存Evernoteに保存