【Pandas】ある一定の期間のデータを取り出して、欠損する日付を埋めて、存在しないデータを0で埋める
先日、python の defaultdict を用いて辞書の重複した値のキーの数を取得しました。
今回は pandas、django-pandas で、データをDataFrame形式にし、重複するデータの数を出して、飛び飛びになっている時系列データの欠損を埋めてみました。
モデルの例
class Test(models.Model):
class Meta:
db_table = "test"
id = models.UUIDField( default=uuid.uuid4, primary_key=True, editable=False )
dt = models.DateTimeField(verbose_name="",default=timezone.now)
test = models.CharField(verbose_name="", max_length=50)
データの整形方法
views.py
from django_pandas.io import read_frame
import pandas as pd
from datetime import date, timedelta
test = Test.objects.all()
df = read_frame(test, fieldnames=['dt', 'test'])
df["date"] = [ d.date() for d in df.dt ]
a = df.loc[:,['date','test']]
b = a.pivot_table(index = ['date'], aggfunc = 'size')
c = b.reset_index()
d = c.set_axis(['date','test_num'],axis=1)
## 一度に書くとこうなる
## e = a.pivot_table(index = ['date'], aggfunc = 'size').reset_index().set_axis(['date','test_num'],axis=1)
print("====================")
print(b)
print("====================")
print(c)
print("====================")
print(d)
print("====================")
## (結果)
====================
date
2022-08-12 4
dtype: int64
====================
date 0
0 2022-08-12 4
====================
date test_num
0 2022-08-12 4
====================
次に、オブジェクトをある一定の期間で取り出して、欠損する日付を埋めて、存在しないデータを0で埋める場合。
today = timezone.now()
past_day = today - datetime.timedelta(days=28)
test = Test.objects.filter(dt__gte=past_day, dt__lte=today).order_by("dt")
df = read_frame(test, fieldnames=['dt', 'test'])
df["date"] = [ d.date() for d in df.dt ]
a = df.loc[:,['date','test']]
b = a.pivot_table(index = ['date'], aggfunc = 'size').reset_index().set_axis(['date','test_num'],axis=1)
start_time = pd.to_datetime(past_day.date())
end_time = pd.to_datetime(today.date())
time_list = pd.date_range(start_time, end_time, freq='D')
df = b.set_index('date').reindex(time_list, fill_value=0)
## (結果)
test_num
2022-07-19 0
2022-07-20 0
2022-07-21 0
2022-07-22 0
...
2022-08-12 4
2022-08-13 0
2022-08-14 0
2022-08-15 0
参考記事
DjangoでPandas(DataFrame)を活用する方法
Pandasの日付が縦に並んでいるデータフレームで、欠けている日付の行を補う方法と気をつけること
Pandas.DataFrameでとびとびの時系列データを補完する
[python] pandasのreindexとdate_rangeを利用して、時系列データの欠損を埋める
お薦め
【静岡県浜松市】コロナ陽性者5万人を調査した結果、ワクチンを何度接種しても重症化率に変わりがないことが判明
【中国・恒大集団】電気自動車(EV)事業に参入するも、生産工場が空の状態になっていることが判明 資金繰り悪化で生産困難か
自分の中から聖書に書かれた罪をなくすことで、不安や心配がなくなり、喜びの涙で溢れる毎日を生きられるようになった(十二弟子・ミナさんの証)