使用df.groupby()进行一些操作

问题描述 投票:0回答:1

我使用外汇数据集,试图填写我的数据框,打开,高,低,关闭更新每个刻度。

这是我的代码:

import pandas as pd

# pandas settings
pd.set_option('display.max_columns', 320)
pd.set_option('display.max_rows', 320)
pd.set_option('display.width', 320)

# creating dataframe
df = pd.read_csv('https://www.dropbox.com/s/tcek3kmleklgxm5/eur_usd_lastweek.csv?dl=1', names=['timestamp', 'ask', 'bid', 'avol', 'bvol'], parse_dates=[0], header=0)
df['spread'] = df.ask - df.bid
df['symbol'] = 'EURUSD'
times = pd.DatetimeIndex(df.timestamp)

# parameters for df.groupby()
df['date'] = times.date
df['hour'] = times.hour

# 1h candles updated every tick
df['candle_number'] = '...'
df['1h_open'] = '...'
df['1h_high'] = '...'
df['1h_low'] = '...'
df['1h_close'] = '...'

# print(df)

grouped = df.groupby(['date', 'hour'])

for idx, x in enumerate(grouped):
    print(idx)
    print(x)



所以你可以看到,使用for循环我得到了组。

现在我想在我的数据框中填写以下列:

  • idx是我的df ['candle_number']
  • df ['1h_open']必须等于组中的第一个df.bid
  • df ['1h_high'] =直到当前行的df.bid中的最高数字(例如,如果组中有350行,对于第20个值,我们计算从0到20跨度的最高数,在第215个值我们0-215跨度的最高值可以完全不同。
  • df ['1h_low'] =直到当前迭代的最低值(与上面相同的方法)

我希望它不会太混乱=)干杯

python pandas dataframe
1个回答
1
投票

在日期和时间重新索引很方便:

df_new = df.set_index(['date', 'hour'])

然后应用按索引聚合的groupby函数:

df_new['candle_number'] = df_new.groupby(level=[0,1]).ngroup()
df_new['1h_open'] = df_new.groupby(level=[0,1])['bid'].first()
df_new['1h_high'] = df_new.groupby(level=[0,1])['bid'].cummax()
df_new['1h_low']  = df_new.groupby(level=[0,1])['bid'].cummin()

你可以reset_index()回到平坦的数据帧。

© www.soinside.com 2019 - 2024. All rights reserved.