Поиск строки в pandas df и выполнение сравнения относительно этого местоположения строки - PullRequest
3 голосов
/ 04 августа 2020

У меня есть объект базы данных, который возвращает результаты моего запроса в виде pandas df. ​​

Один из моих запросов генерирует список дат ( df1 ):

      data_interestDate
0  2020-07-15T00:00:00
1  2020-06-11T00:00:00
2  2020-05-14T00:00:00
3  2020-04-14T00:00:00

Другой запрос возвращает список значений, соответствующих нескольким датам ( df2 ):

              data_date value
0   2020-07-21T00:00:00  47.0
1   2020-07-20T00:00:00  46.0
2   2020-07-17T00:00:00  50.0
3   2020-07-16T00:00:00  46.0
4   2020-07-15T00:00:00  48.0
5   2020-07-14T00:00:00  49.0
6   2020-07-13T00:00:00  48.0
7   2020-07-10T00:00:00  49.0
8   2020-07-09T00:00:00  46.0
9   2020-07-08T00:00:00  51.0
10  2020-07-07T00:00:00  49.0
11  2020-07-06T00:00:00  53.0

Я хочу пройти через df1 и найти совпадающие даты в df2. Как только я получу это, в df2 я хочу взять разницу между значением, соответствующим этой дате, и значением x количество строк до этого. Например, для 2020-07-15T00: 00: 00 в df1 я бы нашел эту дату в df2, а затем сделал бы что-то вроде:

(df2['value']-df2['value'].shift(-5)).iloc()[0] 

, который должен вернуть 3.0, а затем общий вывод

2020-07-15T00:00:00  -5  3.0
2020-06-11T00:00:00  -5  ...
2020-05-14T00:00:00  -5  ...
2020-04-14T00:00:00  -5  ...

1 Ответ

1 голос
/ 04 августа 2020

Я обнаружил, что занимаюсь форматированием, чтобы добраться туда, где вы хотите, чтобы ваш формат был, но:

Запрос DF 1 (df1):

df1.head()

data_interestDate
0   2020-07-15T00:00:00
1   2020-06-11T00:00:00
2   2020-05-14T00:00:00
3   2020-04-14T00:00:00

Запрос DF 2 (df2 ):

df2.head()

    data_date   value
0   2020-07-21T00:00:00 47.0
1   2020-07-20T00:00:00 46.0
2   2020-07-17T00:00:00 50.0
3   2020-07-16T00:00:00 46.0
4   2020-07-15T00:00:00 48.0

Определите значение сдвига:

shift_val = -5

Установите литеральный столбец (поскольку он был у желаемого вывода):

df2['shift'] = shift_val

Создайте df2 со столбцом 'diff', дающим абсолютную разницу значений value и value.shift (shift_value):

df2.loc[(df2['data_date'].isin(df1['data_interestDate'])), 'diff'] = abs(pd.to_numeric(df2['value'])-pd.to_numeric(df2['value'].shift(shift_val)))

Кажется, ваш вопрос говорит, что вы хотите вернуть df2, но ваши примеры показывают возврат df1 . Вот и то, и другое:

Возвращение df1 (как df3):

df3 = df1.merge(df2, left_on='data_interestDate', right_on='data_date', how='left').drop(['data_date','value'], axis=1)
df3['shift'] = shift_val

Здесь мы теряем значение сдвига при соединении, поэтому оно добавляется обратно (об этом не знаю). Выходы:

df3.head()

    data_interestDate   shift   diff
0   2020-07-15T00:00:00 -5  3.0
1   2020-06-11T00:00:00 -5  NaN
2   2020-05-14T00:00:00 -5  NaN
3   2020-04-14T00:00:00 -5  NaN

Возвращение df2 (как df3):

df3 = df2[df2['data_date'].isin(df1['data_interestDate'])].drop(['value'],axis=1)

Выходы:

df3.head()

data_date   shift   diff
4   2020-07-15T00:00:00 -5  3.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...