在每列上使用不同的参数为每第 n 行重新采样 pandas DataFrame?
Resampling pandas DataFrame for every nth row with different parameters on each column?
我有 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 分钟块的 max/min/sum 的地方,它返回了整个列的 high/low/sum。
此外,如果您知道初学者或多或少会理解的更简单的方法,我会洗耳恭听。我只编写了几个星期的代码,所以我真的不知道我在做什么。
注意:我考虑过使用 qcut,但据我所知,我需要提前弄清楚我想要多少个 bin。由于我将要通过相同的基本格式 运行 不同的数据集,所以它似乎不太理想。
因为你有军事时间,所以先用下面的方法把它转换成时间增量。此外,您可能必须添加前导零,因为您有整数。我用 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'})
我有 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 分钟块的 max/min/sum 的地方,它返回了整个列的 high/low/sum。
此外,如果您知道初学者或多或少会理解的更简单的方法,我会洗耳恭听。我只编写了几个星期的代码,所以我真的不知道我在做什么。
注意:我考虑过使用 qcut,但据我所知,我需要提前弄清楚我想要多少个 bin。由于我将要通过相同的基本格式 运行 不同的数据集,所以它似乎不太理想。
因为你有军事时间,所以先用下面的方法把它转换成时间增量。此外,您可能必须添加前导零,因为您有整数。我用 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'})