我有每分钟的股票数据,包括 col_headings 日期、时间、开盘价、最高价、最低价、收盘价、交易量。我需要对每第 n 行重新采样(在本例中为每第 3 行),但在几列上使用不同的参数。到目前为止我的代码是:
import pandas as pd
import numpy as np
spy = pd.read_csv("C:\\Users\\PC\\Desktop\\spy_test.csv")
#Sample for every n minutes
n = 3
b = n-1
spy_date = pd.DataFrame(spy['Date'])
date = spy_date.iloc[b::n, :]
spy_time = pd.DataFrame(spy['Time'])
time = spy_time.iloc[b::n, :]
time = time.reset_index(drop=True)
spy_open = pd.DataFrame(spy['Open'])
open = spy_open.iloc[::n, :]
open = open.reset_index(drop=True)
spy_high = pd.DataFrame(spy['High'])
high_s = spy_high.iloc[::n, :].max()
high = pd.DataFrame(high_s)
high = high.reset_index(drop=True)
spy_low = pd.DataFrame(spy['Low'])
low_s = spy_low.iloc[::n, :].min()
low = pd.DataFrame(low_s)
low = low.reset_index(drop=True)
spy_close = pd.DataFrame(spy['Close'])
close = spy_close.iloc[::n, :]
close = close.reset_index(drop=True)
spy_volume = pd.DataFrame(spy['Volume'])
volume_s = spy_volume.iloc[n::3, :].sum()
volume = pd.DataFrame(volume_s)
volume = volume.reset_index(drop=True)
joined = [date, time, open, high, low, close, volume]
result = pd.concat(joined, axis=1)
result.columns = ['Date', 'Time', 'Open', 'High', 'Low', 'Close', 'Volume']
print(result)
此代码有效,只是“最高价”、“最低价”和“交易量”列仅返回单个值。当我想要每个 3 分钟 block 的最大/最小/总和时,它返回整个列的高/低/总和。
此外,如果您知道一种初学者或多或少能理解的更简单的方法,我洗耳恭听。我只写了几个星期的代码,所以我真的不知道我在做什么。
注意:我考虑过使用 qcut,但据我所知,我需要提前弄清楚我想要多少个垃圾箱。由于我将通过相同的基本格式运行不同的数据集,因此它似乎不太理想。
最佳答案
由于您有军事时间,因此首先将其转换为时间增量。此外,由于您有整数,因此您可能需要添加前导零。我已经使用 zfill
完成了此操作。
df['Time'] = pd.to_timedelta(pd.to_datetime(df.Time.map(lambda x: str(x).zfill(4)),format='%H%M').dt.time.astype(str))
df.set_index('Time').groupby(['Date', pd.Timegrouper('3T')]).agg({'Open':'last', 'High':'max', 'Low':'min', 'Close':'last','Volume':'sum'})
关于python - 为每 n 行重新采样 pandas DataFrame,并在每列上使用不同的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41516303/