python - 我想从数据框中得到一个特定的值,看看下几行的另一个值是什么,但在不同的列中
问题描述
我现在有以下数据框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"]
但这给了我一个错误
解决方案
在下面的代码中,它使用 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)
推荐阅读
- stripe-payments - Stripe - 一次性卡和延迟收费
- c# - (Web API Post 方法)异常处理
- php - 在本地使用 Docker Compose 时如何将所有 stderr 日志保存到文件中
- python - Pytest 参数化依赖
- java - 我无法将数据从第一个活动 (MapActivity) 发送到第二个活动 (NewContact)
- symfony - 用一个表单修改多个实体(批量编辑)
- java - 如何为我的 JTextArea 添加 JScrollPane?
- r - 重新排列表格中的值
- javascript - jQuery在分页中全选不起作用
- ajax - Ajax 不适用于 laravel 项目部署