Kod:
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)
Wyjście df2:
Co chcę: chcę móc sprawdzić, czy dla każdego miasta, dla każdej daty, czy liczba jest większa niż 1 std dev od średniej rezerwacji dla tego miasta. Dla ex pseudocode:
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
Jaki jest problem: Mam trudność, aby dowiedzieć się, jak uzyskać dostęp do potrzebnych danych z każdej z ramek danych, aby to zrobić. Części pseudokodu w nawiasie są tym, czego potrzebuję pomocy.
Co próbowałem:
df2 ["miasto"] lista (df2)
Oba dają mi błędy.
df2 [1: 2]
Łączenie działa, ale wydaje mi się, że nie jest to najlepszy sposób, aby uzyskać do niego dostęp.
Odpowiedzi:
1 dla odpowiedzi № 1Powinieneś użyć apply
funkcja API DataFrame. Demo jest poniżej:
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)
Wydajność:
>>> df
A B C
0 1 1 1
1 2 2 4
2 3 3 9
3 4 4 16
4 5 5 25
Bardziej konkretnie dla twojego przypadku:
Musisz wykonać wstępne obliczenia: "ta sama data i środek miasta", "ta sama data i miasto std dev". Możesz użyć
groupby
funkcja dla niego, pozwala agregować dane według Miasto i data, po tym możesz obliczyć std dev i mean.Umieść std dev i znaczę w swoim stole, użyj do tego słownika:
some_dict = {("city", "date"):[std_dev, mean], ..}
. Do umieszczania danych w ramce danych zastosować funkcjonować.Masz wszystkie dane potrzebne do wykonania czeku zastosować funkcjonować.