問題の説明
1 つはDataframe
、列をグループ化し、各グループ内で別の列の情報に基づいて他の列からデータを抽出する必要がある場合です。たとえば、株価データの場合、株式は異なる日付と各日付の異なる時点で異なる株価を生成します。各日付の始値と終値を取得したい場合は、日付を分類し、最も早い時点で価格データを取得する必要があります。
データ状況
ここでは、ジェフ・ヒートン教授のウェブサイトで公開されている人工的に生成されたデータを使用しており、以下のコードを通して、このデータが毎日異なる時点の株価データであることがわかります。
import pandas as pd
df = pd.read_csv("https://data.heatonresearch.com/data/t81-558/datasets/series-31.csv")
display(df.head())
時間 | 価値 | |
---|---|---|
0 | 2019年08月22日 12:51 | 19.195359 |
1 | 2019年9月19日 09:44 | 13.519543 |
2 | 2019年08月26日 14:05 | 9.191413 |
3 | 2019年08月19日 16:37 | 18.346598 |
4 | 2019年9月5日 09:18 | 1.349778 |
目標
毎日の株価の始値と終値、つまり毎日の最も小さい時点に対応する株価を抽出します。
コード
def extract_date(time):
return pd.to_datetime(time[:time.find(' ')])
df['date'] = df['time'].map(extract_date) #把日期单独抽取出来,用于归类
df['time'] = pd.to_datetime(df['time'], errors='coerce') #转化为datetime类型,可以进行大小的比较
starting_time_idx = df.groupby(['date'])['time'].idxmin() #idxmin()给出组内部time最小的那行的行数
ending_time_idx = df.groupby(['date'])['time'].idxmax() #类似idxmin(), idxmax()给出time最大的行数
result_df = pd.DataFrame()
result_df['starting'] = df.loc[starting_time_idx]['value'].values
result_df['ending'] = df.loc[ending_time_idx]['value'].values