Код:
df = pd.read_csv("example.csv", parse_dates=["ds"])
df2 = df.set_index(["ds", "city"]).unstack("city")
rm = pd.rolling_mean(df2, 3)
sd = pd.rolling_std(df2,3)
Изход df2:
Това, което искам: Искам да видя дали за всеки град, за всяка дата, ако броят е по-голям от 1 стод на разстояние от средната за резервации за този град. За бившия псевдокод:
for each (city column)
for each (date)
see whether the (number of bookings) - (same date and city rolling mean) > (same date and city std dev)
print that date and city and number of bookings
Какъв е проблемът: Имам проблем да се опитам да разбера как да получа достъп до данните, от които се нуждая от всяка от рамките за данни, за да го направят. Частите на псевдокода в скоби са това, от което се нуждая, за да разбера.
Това, което се опитах:
df2 [ "град"] списък (df2)
Двете ми дават грешки.
df2 [1: 2]
Снаждане работи, но аз се чувствам като този не е най-добрият начин за достъп до него.
Отговори:
1 за отговор № 1Трябва да използвате apply
функция на API на DataFrame. Демото е по-долу:
import pandas as pd
df = pd.DataFrame({"A": [1,2,3,4,5]; "B": [1,2,3,4,5]})
df["C"] = df.apply(lambda row: row["A"]*row["B"], axis=1)
изход:
>>> df
A B C
0 1 1 1
1 2 2 4
2 3 3 9
3 4 4 16
4 5 5 25
По-конкретно за вашия случай:
Трябва да прекомплектирате: "същата дата и градска подвижна средна стойност", "същата дата и градски стандарт". Можеш да използваш
groupby
функция за него, тя позволява да се агрегират данни чрез град и дата, след което можете да изчислите std dev и mean.Сложете std dev и означава в таблицата си, използвайте речник за него:
some_dict = {("city", "date"):[std_dev, mean], ..}
, За поставяне на данни в компютърната рамка Приложи функция.Имате всички необходими данни за провеждане на чека ви от Приложи функция.