Цена продукта на заданную дату со значением 10 до изменений
products(product_id, new_price, change_date) фиксирует каждое изменение цены. Найдите цену каждого продукта на 2019-08-16: new_price из его последнего изменения не позднее этой даты, или 10, если изменений к тому моменту не было. Верните product_id, price.
import pandas as pd
def price_on_date(products: pd.DataFrame) -> pd.DataFrame:
# ваш код здесь
Напишите реализацию.
Это поиск на момент времени (point-in-time). Оставляют изменения не позднее целевой даты, берут последнее такое изменение каждого продукта (max change_date, например через idxmax после сортировки или groupby) и читают его new_price.
- ✗Брать последнее изменение, игнорируя целевую дату
- ✗Дефолтить только продукты без строк, а не без изменений до даты
- ✗Усреднять цены вместо as-of поиска
- →Зачем фильтровать по дате до взятия последнего изменения?
- →Как расширить это на произвольный столбец дат запроса?
Restrict to changes on or before the date, take each product's latest one, then fill the default for products with none.
import pandas as pd
def price_on_date(products: pd.DataFrame) -> pd.DataFrame:
cutoff = pd.Timestamp('2019-08-16')
before = products[products['change_date'] <= cutoff]
latest = before.loc[before.groupby('product_id')['change_date'].idxmax()]
result = latest[['product_id', 'new_price']].rename(
columns={'new_price': 'price'})
all_ids = pd.DataFrame({'product_id': products['product_id'].unique()})
return all_ids.merge(result, on='product_id', how='left').fillna({'price': 10})
A product whose only change is after the cutoff (or which never changed) is absent from before, so the left merge leaves its price null and fillna(10) applies the pre-change default. idxmax on change_date per product is the as-of pick.