Выполните итерацию по ячейкам данных Pandas, чтобы вычислить промежуточные итоги на основе других значений ячейки - PullRequest
0 голосов
/ 28 октября 2018

Я хочу рассчитать массовый баланс через систему на Python.В моем текущем примере есть около 35 000 ежедневных записей, но я хочу повторно использовать код для примеров с гораздо большими данными.

У меня есть файл CSV, который собирает ежедневные данные для:

  • Дата
  • поток потока
  • Количество осадков
  • Приток

Я хочу рассчитать новые столбцы данных, которые смотрят как на предыдущий, так и на следующийдней данных.Например, я хочу вычислить дополнительные столбцы, которые представляют:

  • Обход - часть ПРИТОКОВ, которые обходят средство (т. Е. Больше, чем пропускная способность) для пруда с влажной погодой
  • Рециркуляционный поток - если текущие притоки меньше, чем мощность обработки, и насос поступает из пруда с влажной погодой обратно в установку для повторной обработки, если объем пруда> 0
  • Ирригация - если количество осадков в предыдущие 3 дня <10 ммИ в течение следующих 5 дней осадков не будет, поливайте установленный объем </li>
  • PondVolume - Предыдущий объем пруда + байпас - рециркуляция потока орошения

Я новичок в Python и подумал, что буду использоватьПанды для этих данных, так как я мог бы хранить все данные вместе.Я использовал np.where для простых условных вычислений с использованием ячеек в одной и той же строке.

bal['Q_IL2TR'] = np.where(bal['Q_PS2IL']<FullTreatementFloMLDs, bal['Q_PS2IL'], FullTreatementFloMLDs)

Можно ли выполнять итерацию по фрейму данных и создавать новые значения столбцов на основе ячеек в столбцах из предыдущих / следующих строк?Также это лучший подход к проблеме.

1 Ответ

0 голосов
/ 28 октября 2018

Не начинайте с попытки перебрать DataFrame.Это очень медленно.Вместо этого попробуйте сделать все с точки зрения векторов.

Кстати, это:

bal['Q_IL2TR'] = np.where(bal['Q_PS2IL']<FullTreatementFloMLDs, bal['Q_PS2IL'], FullTreatementFloMLDs)

должно быть проще записать как:

bal['Q_IL2TR'] = bal['Q_PS2IL'].clip(upper=FullTreatementFloMLDs)

Что касаетсятакие вещи:

Ирригация - если количество осадков в предыдущие 3 дня <10 мм И в течение следующих 5 дней не было осадков, поливайте установленный объем </p>

Вы можете создавать скользящие суммыс размерами окон 3 и 5 сохраните их как новые столбцы в вашем DataFrame, а затем используйте их для создания условия:

last3 = df.Rain.rolling(3, closed=False).sum() # n.b. you might want 4
next5 = df.Rain.rolling(5, closed=False).sum()
df['Irrigate'] = (last3 < 10) & (next5 == 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...