df.groupby()的一些操作

时间:2019-03-20 17:14:19

标签: python pandas dataframe

我使用一个外汇数据集,尝试用每一个报价更新开,高,低,收盘更新的数据框。

这是我的代码:

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中的最高编号。直到当前行为止(例如,如果组中有350行,则为第20个值) 我们从0-20跨度中计算出最高的数字,在第215个值上 0-215范围内的最大值,可以完全不同。
  • df ['1h_low'] =直到当前迭代之前的最小值(与上述方法相同)

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

1 个答案:

答案 0 :(得分: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()回到平面数据框。

相关问题