初めに
pandas初学者の方向けに、時系列データ(日付データ)の扱い方を株価公開データを用いて解説して行きます。なので、データの準備は不要です。自分もデータ分析を始めたばかりで結構躓いたので、これから勉強を始める方の助けになれると嬉しく思います。
モジュールをインポート
- Pandasは、データを簡単に取り扱う為のデータ操作ツール
- Plotly Expressは、いくつかの公開データセットにアクセスするための便利な関数を提供
import pandas as pd
import plotly.express as px
ファイルの読み込み
- px.data.stocks()で株価公開データを読み込めます
df = px.data.stocks()
時系列データ取り出し方法その1 & 特徴量の作成
df["year"] = df["date"].apply(lambda x :x.split("-")[0])
df["month"] = df["date"].apply(lambda x :x.split("-")[1])
年と月のデータを取り出し、簡単な特徴量の作成をすることができました。
補足:
-
apply() メソッドは、Pandas ライブラリで提供されているデータフレームやシリーズに対して、特定の関数を要素ごとに適用するために使用されます。
具体的には、各要素に関数を適用して処理を行い、その結果を新しいデータフレームまたはシリーズとして返します。 -
lambda 関数は、無名関数または一時的な関数としても知られています。通常の関数とは異なり、関数に名前を付けずに直接定義することができます。主に短い関数や単純な処理に使用されます。
# lambda 関数ではなく、defで関数を定義した場合
def get_year(date):
return date.split("-")[0]
def get_month(date):
return date.split("-")[1]
df["year"] = df["date"].apply(get_year)
df["month"] = df["date"].apply(get_month)
時系列データその2 datetime型
- datetime 型は、日付と時刻を表現するためのPythonの組み込みモジュールであり、日付や時刻に関連する様々な操作を行うことができます。
初めに、データの型を確認します。
# データフレームの基本的な情報を簡潔に確認することができます。
df.info()
datetime型を使う為に、objectからdatetimeに変換します。
# 'date' 列を datetime 型に変換
df['date'] = pd.to_datetime(df['date'])
df.dtypes
datetime 型に変換することができました。
次はデータを年/月/日ごとに取り出していきます。
# 'date' 列の年を抽出
df['year'] = df['date'].dt.year
# 'date' 列の月を抽出
df['month'] = df['date'].dt.month
# 'date' 列の日にちを抽出
df['day'] = df['date'].dt.day
df.sample(10)
日付のフォーマットの変換について
今回扱った株価公開データは2018-01-31の形で日付データが入っていましたが、20180131の形などでデータが入っていても大丈夫です。
例えば、日付文字列が「20180131」である場合、format='%Y%m%d' と指定することで、それを「年-月-日」の形式に変換して pd.to_datetime() 関数によって datetime 型に変換することができます。
# 日付文字列を datetime 型に変換
df['date'] = pd.to_datetime(df['date'], format='%Y%m%d')
具体例
import pandas as pd
# 日付文字列の列を含むデータフレームを作成
df = pd.DataFrame({'date': ['20160301', '20210518', '19991231']})
# 日付文字列を datetime 型に変換
df['date'] = pd.to_datetime(df['date'], format='%Y%m%d')
# 結果を表示
df['date']
補足
format='%Y%m%d' は、日付文字列が「年(4桁)月(2桁)日(2桁)」の形式で表されていることを示すフォーマット指定子です。
format='%Y%m%d'は、%Y は年を4桁で表すための指定子であり、%m は月を2桁で表すための指定子、%d は日を2桁で表すための指定子です。
経過日数
.iloc[0,0]でデータの最初の日にちを指定して、引くことで経過日数を計算できます。
date_df['date'] - date_df.iloc[0,0]
元々1週間置きのデータが入っているため、indexが1進むごとに7日経過していることが分かります。
1カ月ごとのデータの合計
sum_date_AAPL = df.groupby('date')['AAPL'].sum().reset_index()
sum_date_AAPL.set_index('date').resample('M').sum()
1カ月間のデータの合計を出すことができます。平均を出す場合は.mean()を使うと出せます。.resample('M')のMをWにすると1週間ごとの合計が出せます。MはMonthのMです。
補足
.groupby() メソッドは、データフレームを指定した列または複数の列でグループ化するために使用されます。グループ化により、同じ値を持つ行が同じグループにまとめられます。グループ化後、各グループに対して集計操作を行うことができます。
例えば、df.groupby('date')['AAPL'] は、'date' 列でデータフレーム df をグループ化し、'AAPL' 列を抽出したグループオブジェクトを作成します。
.reset_index() メソッドは、データフレームのインデックスをリセットし、新しい連番のインデックスを設定します。リセットされたインデックスは新しい列としてデータフレームに追加されます。
例えば、df.groupby('date')['AAPL'].sum().reset_index() は、'date' 列でグループ化されたデータフレーム df の 'AAPL' 列の値をグループごとに合計し、その結果に新しい連番のインデックスを設定します。
参考
ゼロから始めるデータ分析】 ビジネスケースで学ぶPythonデータサイエンス入門
データサイエンスのための実践Pandas
ChatGPTへの質問
終わりに
今回は時系列データの扱い方をご紹介しました。
次回はSIGNATEの練習問題をもとに特徴量の作成についてまとめようと思います。