import pandas as pd
pd.set_option('expand_frame_repr', False) # 当列太多时不换行
# =====导入数据
df = pd.read_csv('/Users/jxing/Desktop/coin_quant_class/data/class5/BITFINEX-1H-data-20180124.csv', skiprows=1)
# =====groupby常用操作汇总
# 根据'candle_begin_time'进行group,将相同'交易日期'的行放入一个group,
# print(df.groupby('candle_begin_time')) # 生成一个group对象。不会做实质性操作,只是会判断是否可以根据该变量进行groupby
# group后可以使用相关函数,size()计算每个group的行数
# print(df.groupby('candle_begin_time').size()) # 每小时交易的币的个数
# 根据'symbol'进行group,将相同'symbol'的行放入一个group,
# print(df.groupby('symbol').size()) # 每个币交易的小时数
# 获取其中某一个group
# print(df.groupby('candle_begin_time').get_group('2018-01-24 00:00:00'))
# print(df.groupby('symbol').get_group('BTCUSD'))
# 其他常见函数
# print(df.groupby('symbol').describe()) # 只会对数值变量进行describe
# print(df.groupby('symbol').head(3))
# print(df.groupby('symbol').tail(3)) # 每个group里面的行顺序,会保留。
# print(df.groupby('symbol').first())
# print(df.groupby('symbol').last())
# print(df.groupby('symbol').nth(2))
# 将group变量不设置为index
# print(df.groupby('symbol', as_index=False).nth(2))
# 在group之后,取一部分变量进行计算
# 计算每个group的均值
# print(df.groupby('symbol')['close', 'volume'].mean())
# 计算每个group的最大值
# print(df.groupby('symbol')['close', 'volume'].max())
# 计算每个group的加总
# print(df.groupby('symbol')['volume'].sum())
# 计算该数据在每个group中的排名
# print(df.groupby('candle_begin_time')['volume'].rank())
# print(df.groupby('candle_begin_time')['volume'].rank(pct=True))
# 也可以同时用多个变量来进行group,将这些变量的值都相同的行
# df['candle_begin_time'] = pd.to_datetime(df['candle_begin_time'])
# df.loc[df['candle_begin_time'].dt.hour < 12, '时间'] = '上午'
# df['时间'].fillna(value='下午', inplace=True)
# print(df.groupby(['symbol', '时间']).size())
# 我们之前讲过的resample、fillna、apply等常见操作,在group里面都可以进行。
# 这些操作需要大家有一定的积累,若直接在group上进行这些操作不熟练,可以使用已下的方式。
# 遍历group,对每个group进行单独操作,然后将这些group合并起来。
# 语法:for key, group in df.groupby('列名'):
# for symbol, group in df.groupby('symbol'):
# print(symbol)
# print(group)
#
# # 以下可以对各个group进行任意操作。
# # group.fillna()
# # group.apply()
#
# # 操作完之后,将这些group再append起来
# 在一开始不熟练的时候,可以多用遍历每个group的方式