首页 > 解决方案 > 我想从数据框中得到一个特定的值,看看下几行的另一个值是什么,但在不同的列中

问题描述

我现在有以下数据框3:

           size                date          unix   price
0           4.0 2019-11-03 02:42:00  1.570000e+12  9288.5
1           4.0 2019-11-03 02:42:00  1.570000e+12  9288.5
2           4.0 2019-11-03 02:42:00  1.570000e+12  9288.5
3           4.0 2019-11-03 02:42:00  1.570000e+12  9288.5
4           4.0 2019-11-03 02:42:00  1.570000e+12  9288.5
...         ...                 ...           ...     ...
1048570    15.0 2019-11-05 05:48:00  1.570000e+12  9331.0
1048571  3851.0 2019-11-05 05:48:00  1.570000e+12  9331.0
1048572  3793.0 2019-11-05 05:48:00  1.570000e+12  9331.0
1048573  1000.0 2019-11-05 05:48:00  1.570000e+12  9331.0
1048574   200.0 2019-11-05 05:48:00  1.570000e+12  9331.0

我想看看某个尺寸的价格是多少,但 5 分钟后。例如,在尺寸 4 上,我想在 5 分钟后查看价格的价值。

我现在有以下代码,并且无法获取某些数据:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import csv
%matplotlib inline
headers = ['ticker', 'size', 'price', 'unix','type','date']
dtypes = {'ticker': 'str', 'size': 'float', 'price': 'float', 'unix': 'float','type': 'str','date': 'str'}
parse_dates = ['date']
btcnow = pd.read_csv('new 113-115.csv', header=None, names=headers, dtype=dtypes, parse_dates=parse_dates)
now3 = pd.DataFrame(btcnow, columns=['size','date','unix','price'])
x1 = now3.loc[now3["size"] == 24022, "date"]
y1 = now3.loc[now3["size"] == 24022, "size"]

这可以使用 unix 时间或日期时间来完成。(5 分钟是 300 unix)。

预期的输出格式应该是该大小在 5 分钟内的价格。例如尺寸 4 ,它是 2:42 我想知道 2:47 的价格。因此,输出将是 2:47 的价格。但是,数据中有不止一个尺寸 4,因此它应该在每个尺寸 4 旁边输出当前时间和价格以及 5 分钟内的价格。想要输出的示例:

size                date             Date +5             Price(in 5)
4           4.0 2019-11-03 02:42:00  2019-11-03 02:42:00  9278.5
4           4.0 2019-11-03 02:49:00  2019-11-03 02:54:00  9288

我尝试了以下方法:

d1= now3.loc[(now3["size"] == 24022) & (now3["date"]+pd.Timedelta('5 minutes')), "price"]

但这给了我一个错误

标签: pythonpandasdataframe

解决方案


在下面的代码中,它使用 timedelta 修改原始时间以获得所需的时间,然后将其存储在单独的数据帧中。将所需的(时间,大小)对与所有数据进行内部连接,您将获得所需的数据。

from datetime import datetime, timedelta

time_interval = timedelta(minutes = 5)
df = df[[ 'time', 'size', 'price']]

# extract time size for merge
df_time_size= df[['time', 'size']]
df_time_size.loc[:, 'time'] = df_time_size.loc[:, 'time'] + time_interval

# inner join dataframe by size&time
df = df_time_size.merge(df[['time', 'size', 'price']], how = 'inner')
df['orig_time'] = df['time'] - time_interval

输出将如下所示:

                   time size  price            orig_time
0   2019-01-01 12:26:00    1      3  2019-01-01 12:21:00
1   2019-01-01 12:27:00    1      1  2019-01-01 12:22:00

编辑:

为了得到最新的价格,我们可以先分组,然后按时间排序(降序),然后得到第一行。

df = df.groupby('size').apply(lambda x: x.sort_values('time', ascending=False).head(1)).reset_index(drop=True)

推荐阅读