3.8. 課題#

3.8.1. 課題1.#

Section3の内容のうち習得に自信がない部分について、自分でこのNotebookでコードを書いて実行してください。

...

3.8.2. 課題2.#

次のDataFrame df はある電化製品店のパソコンコーナーの受注情報の一部です。

column

description

id

顧客番号

name

顧客名

date

来店日

laptop

購入または修理に持ち込んだパソコンの種類

fix

修理受注であればTrue、購入であればFalse

import numpy as np
import pandas as pd

def make_df():
    df = pd.DataFrame({'id':[100, 100, 101, 101, 101, 102, 103, 104, 104, 105],
                      'name': ['Max', 'Max', 'Bob', 'Bob', 'Bob', 'Alice', 'Chris','Emma', 'William','Jacob'],
                       'gender':['m', 'm', 'm', 'm', 'm', 'f', np.nan, 'f', 'm', 'm'],
                       'date':['2019/3/4','2019/2/5','2018/10/3','2017/12/6','2016/9/3','2019/7/4','2017/1/1','2019/5/3','2018/2/18', '2015/12/30'],
                      'laptop':['mac','mac','windows','windows','mac', 'mac', 'windows', 'windows', 'mac', 'others'],
                      'fix': [True, False, True, False, False, False, False, True, True, True],
                      'price': [10000, 230000, 5400, 15000, 300000, 240000, 180000, 150000, 100000, 3000]})
    return df
make_df()

dfに関して以下の問いに答えてください。

3.8.2.1. 課題2.0(回答例)#

このDataFrame(df)に格納されている一番最初の顧客の名前は何ですか?

回答は一つのstr値を返します。

# 課題の回答は関数(引数無し)の中に全て書いてください。
def answer_zero():
    # どのようなフォーマットで回答すべきか問題文に従ってください。
    df = make_df()
    ans = df.loc[0,'name']
    return ans

# 回答を確認するためには、次のような1行で回答を記入した関数を呼び出すことで確認できます。
answer_zero()

次のcellを実行して回答を確認してください。

print(answer_zero()=='Max')

3.8.2.2. 課題2.1#

DataFrame(df)のdate列をdatetime型に変換し、日付の新しい順(descending)にソートしてください。

回答は1つのSeriesを返します。

def answer_one():
    df = make_df()
    df['date'] = pd.to_datetime(df['date'])
    ans = df['date'].sort_values(ascending=False)
    return ans 

次のセルを実行して回答を確認してください

import datetime
print(answer_one().iloc[0] == datetime.datetime(2019,7,4))
print(answer_one().iloc[4] == datetime.datetime(2018,10,3))
print(answer_one().iloc[9] == datetime.datetime(2015,12,30))

3.8.2.3. 課題2.2#

dfのなかで最も受注回数が多い顧客は誰ですか?

回答は1つのstr型の値を返します。

def answer_two():
    df = make_df()
    ...
    return "YOUR ANSWER"

次のセルを実行して回答を確認してください

print(answer_two() == 'Bob')

3.8.2.4. 課題2.3#

dfのなかで顧客ごとの受注支払額総額を総額が高い順に示してください。

回答は1つのSeriesを返します。返すSeriesのindexは顧客の名前(name)としてください。

def answer_three():
    df = make_df()
    ...
    return "YOUR ANSWER"
answer_three()

次のセルを実行して回答を確認してください

print(answer_three()[0] == 320400)
print(answer_three().index[0] == "Bob")
print(answer_three()[-1] == 3000)
print(answer_three().index[-1] == "Jacob")

3.8.2.5. 課題2.4#

dfのうち修理の受注のみを示すDataFrameをdf_fixとして作ってください。df_fixは受注の日付の古い順(昇順、ascending)に並び替えてください。

回答は1つのDataFrame(5行、7列)を返します。

def answer_four():
    df = make_df()
    ...
    return df_fix 
answer_four()

次のセルを実行して回答を確認してください

import datetime
print(answer_four().shape == (5,7))
print(answer_four().iloc[0]['date'] == datetime.datetime(2015,12,30))
print(answer_four().iloc[-1]['date'] == datetime.datetime(2019,5,3))
print(answer_four().iloc[1]['name'] == 'William')

3.8.2.6. 課題2.5#

dfのうち修理の受注のみを示すDataFrameをdf_fixを用いて、性別での受注件数を示す棒グラフを作成してください。

回答は1つの棒グラフを表示します。

import matplotlib
% matplotlib inline

def answer_five():
    df_fix = answer_four()
    
    ...
    
    plt.show()

次のcellを実行して回答を表示させてください

answer_five()

3.8.2.7. 課題2.6#

dfに新しいcolumnとしてyearを追加してください。yearは受注が何年にあったかを示します。例えばdate(受注日付)が2015-12-1の場合のyear2015となります。

dfidの降順(descending)に並び替え、columnは[['id', 'name','gender','date','year','laptop','fix','price']]の順に表示されるようにしてください。

回答は1つのDataFrame(10行、8列)を返します。

def answer_six():
    df = make_df()
    
    ...
    
    return "YOUR ANSWER"

次のcellを実行して回答を表示させてください

answer_six()

3.8.2.8. 課題2.7#

dfに新しいcolumnとしてyearを追加してください。yearは受注が何年にあったかを示します。例えばdate(受注日付)が2015-12-1の場合のyear2015となります。

dfidの降順(descending)に並び替え、columnは[['id', 'name','gender','date','year','laptop','fix','price']]の順に表示されるようにしてください。

回答は1つのDataFrame(10行、8列)を返します。

def answer_seven():
    df = make_df()
    
    ...
    
    return "YOUR ANSWER"

次のcellを実行して回答を表示させてください

answer_seven()

3.8.2.9. 課題2.8#

年別の受注総額を示すSeriesを作り、年の昇順(ascending)で並び替えてください。

回答は1つのSeriesを返します。

def answer_eight():
    df = answer_six()
    
    ...
    
    return "YOUR ANSWER"

次のcellを実行して回答を表示させてください

answer_eight()

3.8.2.10. 課題2.9#

matplotlibを用いて年別の受注総額を示す棒グラフを作成し表示させてください。 回答は一つの棒グラフを表示させます。

import matplotlib.pyplot as plt
% matplotlib inline

def answer_nine():
    
    ...
    
    plt.show()
    

次のcellを実行して回答を表示させてください

answer_nine()

3.8.2.11. 課題2.10#

ユーザーに入力してもらった単語を示したDataFrame TEXTを考えます。 TEXTのcolumnwordのクリーニングを行って返してください。具体的には、文字列の前後の空白の消去、句読点の記号(#@?!)の消去、全て単語を大文字から始まり残りは小文字になるようにしてください。なお、単語を大文字から始まり残りを小文字にするためにはtitle()を使うことが出来ます。

回答は一つのSeriesを返します。

def make_TEXT():
    TEXT = pd.DataFrame({'id':range(100, 110),
                         'text':['  America   ', 'japan', 'kOrea', 'England?', '@China', 'FrancE', 
                                 'germany??', 'iNdia', '   Philipines##', 'new zealand']})
    return TEXT
def ans_ten():
    
    TEXT = make_TEXT()
    
    ...
    
    return "YOUR ANSWER"              

次のcellを実行して回答を表示させてください

ans_ten()