import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from pandas import Series, DataFrame

"""
Explanation: pandasのデータフレーム
End of explanation
"""


from numpy.random import normal

def create_dataset(num):
    data_x = np.linspace(0,1,num)
    data_y = np.sin(2*np.pi*data_x) + normal(loc=0, scale=0.3, size=num)
    return data_y

create_dataset(10)

"""
Explanation: 練習問題
(1) 0≦x≦1の範囲を等分した num 個の点ついて、「sin(2πx) + 正規分布の乱数（標準偏差0.3）」を計算した array を返す関数 create_dataset(num) を作成してください。
End of explanation
"""


def create_dataset1(num):
    data_x = np.linspace(0,1,num)
    data_y = np.sin(2*np.pi*data_x) + normal(loc=0, scale=0.3, size=num)
    df = DataFrame()
    df['x'] = data_x
    df['y'] = data_y
    return df

create_dataset1(10)

def create_dataset2(num):
    data_x = np.linspace(0,1,num)
    data_y = np.sin(2*np.pi*data_x) + normal(loc=0, scale=0.3, size=num)
    df = DataFrame({'x': data_x, 'y': data_y})
    return df

create_dataset2(10)

def create_dataset3(num):
    data_x = np.linspace(0,1,num)
    data_y = np.sin(2*np.pi*data_x) + normal(loc=0, scale=0.3, size=num)
    col_x = Series(data_x, name='x')
    col_y = Series(data_y, name='y')
    df = pd.concat([col_x, col_y], axis=1)
    return df

create_dataset3(10)

"""
Explanation: (2) (1)の関数について、xの値と、対応する「y = sin(2πx) + 正規分布の乱数（平均0, 標準偏差0.3）」の値を列に持つDataFrameを返すように修正してください。（列の名前は、それぞれ 'x' および 'y' とします。）
例えば、次のような実装方法が考えられます。複数の方法を試してみてください。

列'x'と列'y'に対応するarrayオブジェクト data_x, data_y を用意した後、これらを列に持つDataFrameを定義する。（ディクショナリー形式のオプションで列を指定する。）
列'x'と列'y'に対応するarrayオブジェクト data_x, data_y を用意した後、空のDataFrameを作成して、df['x']=data_x のように列名指定でデータを追加する。
列'x'と列'y'を個別のSeriesオブジェクトとして作成した後、pd.concat()で結合する。
End of explanation
"""


data = create_dataset1(1000)
data.describe()

"""
Explanation: (3) (2)の関数を用いて、num=1000 のデータフレームを作成した後、describe()メソッドでデータの統計情報を確認してください。
End of explanation
"""


