26
35

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

はじめての記事投稿

pandas時系列データの扱い方

Last updated at Posted at 2023-06-24

初めに

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])

2023-06-24 134738.png
年と月のデータを取り出し、簡単な特徴量の作成をすることができました。

補足:

  • 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()

2023-06-24 140755.png
dateの型がobjectになっていることが分かります。

datetime型を使う為に、objectからdatetimeに変換します。

# 'date' 列を datetime 型に変換
df['date'] = pd.to_datetime(df['date'])
df.dtypes

2023-06-24 141327.png

datetime 型に変換することができました。
次はデータを年/月/日ごとに取り出していきます。

# 'date' 列の年を抽出
df['year'] = df['date'].dt.year

2023-06-24 141728.png

# 'date' 列の月を抽出
df['month'] = df['date'].dt.month

2023-06-24 142335.png

# 'date' 列の日にちを抽出
df['day'] = df['date'].dt.day

2023-06-24 142438.png

df.sample(10)

2023-06-24 142714.png
年/月/日ごとにデータを取り出すことができました。

日付のフォーマットの変換について

今回扱った株価公開データは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']

2023-06-24 144745.png

補足
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]

2023-06-24 145658.png

元々1週間置きのデータが入っているため、indexが1進むごとに7日経過していることが分かります。
2023-06-24 150005.png

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です。
2023-06-24 151453.png

補足


.groupby() メソッドは、データフレームを指定した列または複数の列でグループ化するために使用されます。グループ化により、同じ値を持つ行が同じグループにまとめられます。グループ化後、各グループに対して集計操作を行うことができます。

例えば、df.groupby('date')['AAPL'] は、'date' 列でデータフレーム df をグループ化し、'AAPL' 列を抽出したグループオブジェクトを作成します。


.reset_index() メソッドは、データフレームのインデックスをリセットし、新しい連番のインデックスを設定します。リセットされたインデックスは新しい列としてデータフレームに追加されます。

例えば、df.groupby('date')['AAPL'].sum().reset_index() は、'date' 列でグループ化されたデータフレーム df の 'AAPL' 列の値をグループごとに合計し、その結果に新しい連番のインデックスを設定します。


参考

ゼロから始めるデータ分析】 ビジネスケースで学ぶPythonデータサイエンス入門
データサイエンスのための実践Pandas
ChatGPTへの質問

終わりに

今回は時系列データの扱い方をご紹介しました。
次回はSIGNATEの練習問題をもとに特徴量の作成についてまとめようと思います。

26
35
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
35

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?