【python】pandas 週の最大値と最小値の差分を出す方法
【python】pandas 週の最大値と最小値の差分を出す方法
pandas覚えてくるとすごく楽しいです。
今までSQLで書いてたため、手数の多かった集計が簡単な命令だけで出来てしまう。
pandasマジですごい。
週次集計のポイント
- 日付にindexを貼っておく
- インデックスを付けた配列(List)から【リスト.resample().集計方法】で取り出す
週の最大値を取り出す
#views.py
import pandas as pd
from .models import Weather
def CloverIndexView(request):
"""MySQLのテーブル読込"""
data_01 = Weather.objects.filter(observation_date__range=['2020-02-23', '2020-11-29'])
"""データ成形"""
list_pandas = []
for dt in data_02:
list_pandas.append([dt.observation_date, dt.max_temperature])#最高気温をリストに追加
list_pandas.append([dt.observation_date, dt.min_temperature])#最低気温をリストに追加
"""DataFrame準備"""
df = pd.DataFrame(list_pandas)
df[0] = pd.to_datetime(df[0])
mm = df.set_index([0])
"""週の最大値を取り出す"""
ma = mm.resample("W").max()#リストに週間最高気温を格納
リスト.resample("W").max()だけで週間最大値を取り出せます。【"W"】を【"Y"】にすれば年間。【"3D"】にすれば3日間毎の集計結果を出力できます。
週の最小値を取り出す
#20行目までは共通なので省略
"""週の最小値を取り出す"""
ma = mm.resample("W").min()
日時や年次の処理方法は最大値と同じです。
週の最大値-最小値の差分を取り出す
#20行目までは共通なので省略
"""週の最大値-最小値を取り出す"""
ma = mm.resample("W").max() - mm.resample("W").min()
そのまま引き算で処理可能です。
毎日の最大値-最小値の差分の週の最大値を取り出す
#20行目までは共通なので省略
"""週の最小値を取り出す"""
mb = mm.resample("D").max() - mm.resample("D").min()
mc = mb.resample("W").max()
まず毎日の差分を算出し、その最大値を取得すると日計差分の最大値を取得できます。
計算結果を昇順で並び替える
#20行目までは共通なので省略
"""週の最大値-最小値を取り出す"""
ma = mm.resample("W").max() - mm.resample("W").min()
ma = ma.sort_values([1])
これで差分の昇順で並び替えされます。
計算結果を降順で並び替える
#20行目までは共通なので省略
"""週の最大値-最小値を取り出す"""
ma = mm.resample("W").max() - mm.resample("W").min()
ma = ma.sort_values([1], ascending=False)
ascending=Falseを書き加えると降順になります。
計算結果を大きい順に5つ取り出す
#20行目までは共通なので省略
"""週の最大値-最小値を取り出す"""
ma = mm.resample("W").max() - mm.resample("W").min()
ma = ma[1].nlargest(5)
Laravelで操作してた時は最初並び替えてそれを上から順に取り出すとかやってましたけど、pandas使うと一発です。
計算結果を小さい順に5つ取り出す
#20行目までは共通なので省略
"""週の最大値-最小値を取り出す"""
ma = mm.resample("W").max() - mm.resample("W").min()
ma = ma[1].nsmallest(5)
売上TOP5とか降順上位の取り出しの用途は多いので、一切の複雑さが無いのがありがたいです。
まとめ
DataFrameに格納してしまえばあとは簡単な指示でよろしくやってくれる。
いやぁpandasすごい!

