Pandas 多指数 EWMA:比较多天的同一分钟
Pandas Multi-Index EWMA: Comparing same minute over multiple days
我正在尝试将数据集插入 Pandas 并且正在使用该方法做一些独特的事情。
我的数据集如下所示:
Date, Time, Venue, Volume, SummedVolume
2015-09-14, 09:30, NYSE, 1000, 10000
2015-09-14, 09:31, NYSE, 1100, 10100
但是,我将此数据按每个日期的分钟进行切片。我有几天前的文件,所以我调用了一定数量的文件并将它们连接到我的 DataFrame 中,通常使用最近 20 天的文件。
我想做的是使用 pandas ewma 在这 20 天的同一分钟内按 Venue 执行 ewma。那么结果会是什么,比较纽约证券交易所过去 20 天的 09:30 分钟,使用 alpha 0.5(我认为在这种情况下是 span=20)。显然,对数据进行排序,使最旧的数据在后面,最新的数据在前面很关键,所以我也是这样做的,数据不能随机排列。
现在,我可以 pandas 使用 Time 和 Venue 上的 groupby(如下所示)对该数据集进行简单的数学运算(均值等)。但是,当我尝试对此执行 ewma 时,出现无法对非唯一数据集执行 ewma 的错误 - 这是合理的。但是将日期添加到 MultiIndex 类型的残骸中,能够将同一分钟与其他日期的那一分钟进行比较。
这里有人能想出解决办法吗?
frame = pd.DataFrame()
concat = []
for fn in files:
df = pd.read_csv(fn, index_col=None, header=0)
concat.append(df)
frame = pd.concat(concat)
df = pd.DataFrame(frame)
if conf == "VenueStats":
grouped = df.groupby(['time','Venue'], sort=True)
elif conf == "SymbolStats":
grouped = df.groupby(['time','Symbol'], sort=True)
stats = grouped.mean().astype(int)
stats.to_csv('out.csv')
平均值之前 df.head() 的初始输出(我将地点名称和值更改为 0,因为这是敏感信息):
Date Time Venue Volume SummedVolume
0 2015-09-14 17:00 NYSE 0 0
1 2015-09-14 17:00 ARCA 0 0
2 2015-09-14 17:00 AMEX 0 0
3 2015-09-14 17:00 NASDAQ 0 0
4 2015-09-14 17:00 BATS 0 0
stats.head() 均值后的输出:
Volume SummedVolume
Time Venue
00:00 NYSE 0 0
ARCA 0 0
AMEX 0 0
NASDAQ 0 0
BATS 0 0
以下是我尝试执行 ewma 时执行平均(以上)的不同之处:
for fn in files:
df = pd.read_csv(fn, index_col=[0,1,2], header=0) #0=Date,1=Time,2=Venue
concat.append(df)
frame = pd.concat(concat)
df = pd.DataFrame(frame, columns=['Volume','SummedVolume'])
if conf == "VenueStats":
stats = df.groupby(df.index).apply(lambda x: pd.ewma(x,span=20))
elif conf == "SymbolStats":
stats = df.groupby(df.index).apply(lambda x: pd.ewma(x,span=20))
这是 ewma 版本的 df.head() 和 ewma 版本的 stats.head()(它们看起来一样):
Volume SummedVolume
Date Time Venue
2015-09-14 17:00 NYSE 0 0
ARCA 0 0
AMEX 0 0
NASDAQ 0 0
BATS 0 0
Volume SummedVolume
Date Time Venue
2015-09-14 17:00 NYSE 0 0
ARCA 0 0
AMEX 0 0
NASDAQ 0 0
BATS 0 0
您想旋转数据,使日期在一个轴上,时间在另一个轴上。
如果没有一些可重现的数据,很难解决这个问题,但解决方案是这样的:
df2 = (df.reset_index()
.groupby(['tradeDate', 'time', 'exchange'])
.first() # Given that the data is unique by selected grouping
.unstack(['exchange', 'time'])
pd.ewma(df2, span=20)
我正在尝试将数据集插入 Pandas 并且正在使用该方法做一些独特的事情。
我的数据集如下所示:
Date, Time, Venue, Volume, SummedVolume
2015-09-14, 09:30, NYSE, 1000, 10000
2015-09-14, 09:31, NYSE, 1100, 10100
但是,我将此数据按每个日期的分钟进行切片。我有几天前的文件,所以我调用了一定数量的文件并将它们连接到我的 DataFrame 中,通常使用最近 20 天的文件。
我想做的是使用 pandas ewma 在这 20 天的同一分钟内按 Venue 执行 ewma。那么结果会是什么,比较纽约证券交易所过去 20 天的 09:30 分钟,使用 alpha 0.5(我认为在这种情况下是 span=20)。显然,对数据进行排序,使最旧的数据在后面,最新的数据在前面很关键,所以我也是这样做的,数据不能随机排列。
现在,我可以 pandas 使用 Time 和 Venue 上的 groupby(如下所示)对该数据集进行简单的数学运算(均值等)。但是,当我尝试对此执行 ewma 时,出现无法对非唯一数据集执行 ewma 的错误 - 这是合理的。但是将日期添加到 MultiIndex 类型的残骸中,能够将同一分钟与其他日期的那一分钟进行比较。
这里有人能想出解决办法吗?
frame = pd.DataFrame()
concat = []
for fn in files:
df = pd.read_csv(fn, index_col=None, header=0)
concat.append(df)
frame = pd.concat(concat)
df = pd.DataFrame(frame)
if conf == "VenueStats":
grouped = df.groupby(['time','Venue'], sort=True)
elif conf == "SymbolStats":
grouped = df.groupby(['time','Symbol'], sort=True)
stats = grouped.mean().astype(int)
stats.to_csv('out.csv')
平均值之前 df.head() 的初始输出(我将地点名称和值更改为 0,因为这是敏感信息):
Date Time Venue Volume SummedVolume
0 2015-09-14 17:00 NYSE 0 0
1 2015-09-14 17:00 ARCA 0 0
2 2015-09-14 17:00 AMEX 0 0
3 2015-09-14 17:00 NASDAQ 0 0
4 2015-09-14 17:00 BATS 0 0
stats.head() 均值后的输出:
Volume SummedVolume
Time Venue
00:00 NYSE 0 0
ARCA 0 0
AMEX 0 0
NASDAQ 0 0
BATS 0 0
以下是我尝试执行 ewma 时执行平均(以上)的不同之处:
for fn in files:
df = pd.read_csv(fn, index_col=[0,1,2], header=0) #0=Date,1=Time,2=Venue
concat.append(df)
frame = pd.concat(concat)
df = pd.DataFrame(frame, columns=['Volume','SummedVolume'])
if conf == "VenueStats":
stats = df.groupby(df.index).apply(lambda x: pd.ewma(x,span=20))
elif conf == "SymbolStats":
stats = df.groupby(df.index).apply(lambda x: pd.ewma(x,span=20))
这是 ewma 版本的 df.head() 和 ewma 版本的 stats.head()(它们看起来一样):
Volume SummedVolume
Date Time Venue
2015-09-14 17:00 NYSE 0 0
ARCA 0 0
AMEX 0 0
NASDAQ 0 0
BATS 0 0
Volume SummedVolume
Date Time Venue
2015-09-14 17:00 NYSE 0 0
ARCA 0 0
AMEX 0 0
NASDAQ 0 0
BATS 0 0
您想旋转数据,使日期在一个轴上,时间在另一个轴上。
如果没有一些可重现的数据,很难解决这个问题,但解决方案是这样的:
df2 = (df.reset_index()
.groupby(['tradeDate', 'time', 'exchange'])
.first() # Given that the data is unique by selected grouping
.unstack(['exchange', 'time'])
pd.ewma(df2, span=20)