максимальное отклонение в течение одной секунды для каждой строки в DataFrame - PullRequest
0 голосов
/ 30 апреля 2020

У меня проблема с вычислением pandas, и я хотел бы знать, может ли кто-нибудь мне помочь.

Создание этого df с использованием этого кода:

df = pd.DataFrame({'B': [0, 2, 1, np.nan, 4, 1, 3, 10, np.nan, 3, 6]},
                  index = [pd.Timestamp('20130101 09:31:23.999'),
                           pd.Timestamp('20130101 09:31:24.200'),
                           pd.Timestamp('20130101 09:31:24.250'),
                           pd.Timestamp('20130101 09:31:25.000'),
                           pd.Timestamp('20130101 09:31:25.375'),
                           pd.Timestamp('20130101 09:31:25.850'),
                           pd.Timestamp('20130101 09:31:26.100'),
                           pd.Timestamp('20130101 09:31:27.150'),
                           pd.Timestamp('20130101 09:31:28.050'),
                           pd.Timestamp('20130101 09:31:28.850'),
                           pd.Timestamp('20130101 09:31:29.200')])
df

|                         | B    |
|-------------------------|------|
| 2013-01-01 09:31:23.999 | 0.0  |
| 2013-01-01 09:31:24.200 | 2.0  |
| 2013-01-01 09:31:24.250 | 1.0  |
| 2013-01-01 09:31:25.000 | NaN  |
| 2013-01-01 09:31:25.375 | 4.0  |
| 2013-01-01 09:31:25.850 | 1.0  |
| 2013-01-01 09:31:26.100 | 3.0  |
| 2013-01-01 09:31:27.150 | 10.0 |
| 2013-01-01 09:31:28.050 | NaN  |
| 2013-01-01 09:31:28.850 | 3.0  |
| 2013-01-01 09:31:29.200 | 6.0  |

Я хотел бы иметь возможность рассчитать для каждой строки, каково максимальное изменение B в течение одной секунды.

Например, в первом ряду вам нужно будет посмотреть, насколько оно изменилось относительно второго ряда и третьего ряда, которые находятся в пределах интервала секунды и вычисляют разницу с максимальным значением.

В этом случае максимальное значение находится во второй строке «09: 31: 24.200», максимальное отклонение будет 2 - 0.

Затем мы создадим новый столбец с все эти максимальные вариации для каждой из строк.

df

|                         | B    | Maximum Variation  |
|-------------------------|------|--------------------|
| 2013-01-01 09:31:23.999 | 0.0  | 2.0                |
| 2013-01-01 09:31:24.200 | 2.0  | 1.0                |
| 2013-01-01 09:31:24.250 | 1.0  | 0.0                |
| 2013-01-01 09:31:25.000 | NaN  | 4.0                |
| 2013-01-01 09:31:25.375 | 4.0  |-3.0                |
| 2013-01-01 09:31:25.850 | 1.0  | 2.0                |
| 2013-01-01 09:31:26.100 | 3.0  | 0.0                |
| 2013-01-01 09:31:27.150 | 10.0 | 0.0                |
| 2013-01-01 09:31:28.050 | NaN  | 3.0                |
| 2013-01-01 09:31:28.850 | 3.0  | 3.0                |
| 2013-01-01 09:31:29.200 | 6.0  | 0.0                |

Я надеюсь, что это достаточно ясно

Решение было найдено и распространено в ответах, но все же повышение эффективности в этом решение, не требующее создания al oop для каждой строки df, будет приветствоваться

Ответы [ 2 ]

0 голосов
/ 01 мая 2020

Я наконец нашел решение:

df = pd.DataFrame({'B': [0, 1, 2, 8, 6, 1, 3, 10, np.nan, 3, 6]},
                  index = [pd.Timestamp('20130101 09:31:23.999'),
                           pd.Timestamp('20130101 09:31:24.200'),
                           pd.Timestamp('20130101 09:31:24.250'),
                           pd.Timestamp('20130101 09:31:25.000'),
                           pd.Timestamp('20130101 09:31:25.375'),
                           pd.Timestamp('20130101 09:31:25.850'),
                           pd.Timestamp('20130101 09:31:26.100'),
                           pd.Timestamp('20130101 09:31:27.150'),
                           pd.Timestamp('20130101 09:31:28.050'),
                           pd.Timestamp('20130101 09:31:28.850'),
                           pd.Timestamp('20130101 09:31:29.200')])

df = df.reset_index()

df = df.rename(columns={"index": "start_date"})

df['duration_in_seconds'] = 1

df['end_date'] = df['start_date'] + pd.to_timedelta(df['duration_in_seconds'], unit='s')

df['max'] = np.nan

for index, row in df.iterrows():
    start = row['start_date']
    end = row['end_date']
    maxi = df[(df['start_date'] >= start ) & (df['start_date'] <= end)]['B'].max()
    df.iloc[index, df.columns.get_loc('max')] = maxi

df['Maximum Variation'] = df['max'] - df['B']

df

|    | start_date              | B    | duration_in_seconds | end_date                | max  | Maximum Variation |
|----|-------------------------|------|---------------------|-------------------------|------|-------------------|
| 0  | 2013-01-01 09:31:23.999 | 0.0  | 1                   | 2013-01-01 09:31:24.999 | 2.0  | 2.0               |
| 1  | 2013-01-01 09:31:24.200 | 1.0  | 1                   | 2013-01-01 09:31:25.200 | 8.0  | 7.0               |
| 2  | 2013-01-01 09:31:24.250 | 2.0  | 1                   | 2013-01-01 09:31:25.250 | 8.0  | 6.0               |
| 3  | 2013-01-01 09:31:25.000 | 8.0  | 1                   | 2013-01-01 09:31:26.000 | 8.0  | 0.0               |
| 4  | 2013-01-01 09:31:25.375 | 6.0  | 1                   | 2013-01-01 09:31:26.375 | 6.0  | 0.0               |
| 5  | 2013-01-01 09:31:25.850 | 1.0  | 1                   | 2013-01-01 09:31:26.850 | 3.0  | 2.0               |
| 6  | 2013-01-01 09:31:26.100 | 3.0  | 1                   | 2013-01-01 09:31:27.100 | 3.0  | 0.0               |
| 7  | 2013-01-01 09:31:27.150 | 10.0 | 1                   | 2013-01-01 09:31:28.150 | 10.0 | 0.0               |
| 8  | 2013-01-01 09:31:28.050 | NaN  | 1                   | 2013-01-01 09:31:29.050 | 3.0  | NaN               |
| 9  | 2013-01-01 09:31:28.850 | 3.0  | 1                   | 2013-01-01 09:31:29.850 | 6.0  | 3.0               |
| 10 | 2013-01-01 09:31:29.200 | 6.0  | 1                   | 2013-01-01 09:31:30.200 | 6.0  | 0.0               |

Более эффективные решения по-прежнему приветствуются

0 голосов
/ 30 апреля 2020
import numpy as np
import pandas as pd
df = pd.DataFrame({'B': [0, 2, 1, np.nan, 4, 1, 3, 10, np.nan, 3, 6]},
                  index = [pd.Timestamp('20130101 09:31:23.999'),
                           pd.Timestamp('20130101 09:31:24.200'),
                           pd.Timestamp('20130101 09:31:24.250'),
                           pd.Timestamp('20130101 09:31:25.000'),
                           pd.Timestamp('20130101 09:31:25.375'),
                           pd.Timestamp('20130101 09:31:25.850'),
                           pd.Timestamp('20130101 09:31:26.100'),
                           pd.Timestamp('20130101 09:31:27.150'),
                           pd.Timestamp('20130101 09:31:28.050'),
                           pd.Timestamp('20130101 09:31:28.850'),
                           pd.Timestamp('20130101 09:31:29.200')])

print(df)

    B
2013-01-01 09:31:23.999 0.0
2013-01-01 09:31:24.200 2.0
2013-01-01 09:31:24.250 1.0
2013-01-01 09:31:25.000 NaN
2013-01-01 09:31:25.375 4.0
2013-01-01 09:31:25.850 1.0
2013-01-01 09:31:26.100 3.0
2013-01-01 09:31:27.150 10.0
2013-01-01 09:31:28.050 NaN
2013-01-01 09:31:28.850 3.0
2013-01-01 09:31:29.200 6.0

df_min = df.resample('1S').min()
print(df_min)

    B
2013-01-01 09:31:23 0.0
2013-01-01 09:31:24 1.0
2013-01-01 09:31:25 1.0
2013-01-01 09:31:26 3.0
2013-01-01 09:31:27 10.0
2013-01-01 09:31:28 3.0
2013-01-01 09:31:29 6.0

df_max = df.resample('1S').max()
print(df_max)

    B
2013-01-01 09:31:23 0.0
2013-01-01 09:31:24 2.0
2013-01-01 09:31:25 4.0
2013-01-01 09:31:26 3.0
2013-01-01 09:31:27 10.0
2013-01-01 09:31:28 3.0
2013-01-01 09:31:29 6.0


df_diff = df_max - df_min

print(df_diff)

    B
2013-01-01 09:31:23 0.0
2013-01-01 09:31:24 1.0
2013-01-01 09:31:25 3.0
2013-01-01 09:31:26 0.0
2013-01-01 09:31:27 0.0
2013-01-01 09:31:28 0.0
2013-01-01 09:31:29 0.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...