Очистка ошибочной накопительной суммы с помощью PandasPython

Программы на Python
Anonymous
Очистка ошибочной накопительной суммы с помощью Pandas

Сообщение Anonymous »

Я пытаюсь эффективно очистить временной ряд Pandas, содержащий ежедневную совокупную сумму осадков. Иногда несколько последовательных значений ниже предыдущего значения. Я пытаюсь заменить эти значения последним правильным значением.
Обратите внимание, что временной ряд содержит несколько дней, поэтому совокупная сумма сбрасывается для первой временной метки каждого дня.Пример данных с ошибочными значениями в первый день в метках времени 2024-08-12 14:14:48+00:00 и 2024-08-12 14:19:55+00:00< /код>:

Код: Выделить всё

                           RR_TODAY                       day  day_change
timestamp
2024-08-12 14:04:57+00:00      0.00 2024-08-13 00:00:00+10:00        True
2024-08-12 14:09:58+00:00      1.50 2024-08-13 00:00:00+10:00       False
2024-08-12 14:14:48+00:00      1.40 2024-08-13 00:00:00+10:00       False
2024-08-12 14:19:55+00:00      1.40 2024-08-13 00:00:00+10:00       False
2024-08-12 14:24:58+00:00      1.50 2024-08-13 00:00:00+10:00       False
2024-08-12 14:24:58+00:00      1.60 2024-08-13 00:00:00+10:00       False
2024-08-14 13:39:59+00:00      0.91 2024-08-14 00:00:00+10:00       True
2024-08-14 13:44:52+00:00      1.01 2024-08-14 00:00:00+10:00       False
2024-08-14 13:49:56+00:00      1.40 2024-08-14 00:00:00+10:00       False
2024-08-14 13:54:51+00:00      9.91 2024-08-14 00:00:00+10:00       False
2024-08-14 13:59:53+00:00      9.91 2024-08-14 00:00:00+10:00       False
Что бы я хотел получить в итоге:

Код: Выделить всё

                           RR_TODAY                       day  day_change
timestamp
2024-08-12 14:04:57+00:00      0.00 2024-08-13 00:00:00+10:00        True
2024-08-12 14:09:58+00:00      1.50 2024-08-13 00:00:00+10:00       False
2024-08-12 14:14:48+00:00      1.50 2024-08-13 00:00:00+10:00       False
2024-08-12 14:19:55+00:00      1.50 2024-08-13 00:00:00+10:00       False
2024-08-12 14:24:58+00:00      1.50 2024-08-13 00:00:00+10:00       False
2024-08-12 14:24:58+00:00      1.60 2024-08-13 00:00:00+10:00       False
2024-08-14 13:39:59+00:00      0.91 2024-08-14 00:00:00+10:00       True
2024-08-14 13:44:52+00:00      1.01 2024-08-14 00:00:00+10:00       False
2024-08-14 13:49:56+00:00      1.40 2024-08-14 00:00:00+10:00       False
2024-08-14 13:54:51+00:00      9.91 2024-08-14 00:00:00+10:00       False
2024-08-14 13:59:53+00:00      9.91 2024-08-14 00:00:00+10:00       False
Я придумал следующее решение, которое работает, но крайне неэффективно:

Код: Выделить всё

def cleanup_RR_TODAY(df: pd.DataFrame) -> pd.Series:
"""
Cleanup the RR_TODAY measure by setting the value to max day value if the value is less than that
:param df: The DataFrame to cleanup
:return: The cleaned up DataFrame
"""
max_value = np.nan
clean_series = pd.Series(dtype="float64")
for index, value in df.iterrows():
if (
np.isnan(max_value)
or value["day_change"]
or (not np.isnan(value["RR_TODAY"]) and value["RR_TODAY"] > max_value)
):
max_value = value["RR_TODAY"]
clean_series[index] = max_value
elif value["RR_TODAY"] < max_value:
clean_series[index] = max_value
else:
clean_series[index] = value["RR_TODAY"]
return clean_series

df["day"] = df.index.tz_convert(station.timezone).floor("D")
df["day_change"] = df["day"] != df["day"].shift(periods=1)
df["RR_TODAY"] = cleanup_RR_TODAY(df)
Я рассматриваю векторизованное решение, которое будет работать намного быстрее


Подробнее здесь: https://stackoverflow.com/questions/790 ... ith-pandas

Вернуться в «Python»