【问题标题】:Resampling pandas DataFrame for every nth row with different parameters on each column?在每列上使用不同参数对每 n 行重新采样 pandas DataFrame?
【发布时间】:2017-05-21 20:12:33
【问题描述】:

我有每分钟的股票数据 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 分钟块的最大/最小/总和的地方,它返回了整个列的高/低/总和。

另外,如果您知道一个初学者或多或少会理解的更简单的方法,我会全力以赴。我只写了几个星期的代码,所以我真的不知道我在做什么。

注意:我考虑过使用 qcut,但据我所知,我需要提前弄清楚我想要多少个垃圾箱。由于我将通过相同的基本格式运行不同的数据集,因此它似乎不太理想。

【问题讨论】:

    标签: python pandas dataframe resampling


    【解决方案1】:

    由于您有军事时间,因此首先将其转换为 timedelta,如下所示。此外,由于您有整数,因此您可能必须添加前导零。我已经通过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'})
    

    【讨论】:

    • 感谢您的回复,我会试一试并告诉您!
    • 跑了这个,但它返回:TypeError:仅对 DatetimeIndex、TimedeltaIndex 或 PeriodIndex 有效,但有一个“Int64Index”实例原始文件在单独的列中带有日期和时间。我可以让 pandas 解析传入的日期,但无法让它解析时间和/或将其添加到日期列中以生成准确的日期时间索引。时间以军事格式出现,其中 930 = 上午 9:30
    • 您需要将“时间”列设为 timedelta 类型。在此之前运行:df['Time'] = pd.to_timedelta(df['Time'])
    • 您可能必须将其设为字符串,因此如果上述方法不起作用,请尝试此操作。 df['Time'] = pd.to_timedelta(df['Time'].astype(str))
    • 我更新了我的原始答案,将军事时间转换为时间增量。我还删除了我的其他答案,因为它是一个评论。
    猜你喜欢
    • 2013-01-13
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 2019-11-05
    • 2012-08-24
    • 2017-09-30
    • 2012-10-02
    • 2017-05-22
    相关资源
    最近更新 更多