熊猫多指数EWMA:比较多天的同一分钟

时间:2015-09-14 21:27:36

标签: python pandas statistics

我正在尝试将数据集插入到Pandas中,并且正在尝试使用该方法做一些独特的事情。

我有一个如下所示的数据集:

itemFilter.filter(**your_dict)

但是,我按日期将这些数据按分钟切片。我有几天的文件,所以我调用了一定数量的文件并将它们连接到我的DataFrame中,通常使用过去20天。

我想做的是使用pandas ewma在当天的同一分钟,在这20天内,通过Venue进行一次ewma。那么结果是,比较纽约证券交易所过去20天的09:30分钟,使用0.5的alpha(我认为在这种情况下,span = 20)。显然,对数据进行排序,以便最旧的数据在后面,最新的数据在前面是至关重要的,所以我也这样做,数据不能按随机顺序排列。

现在,我可以使用groupby on Time and Venue(如下所示)让pandas对此数据集进行简单的数学运算(均值等)。但是,当我尝试对此做一个ewma时,我得到的错误是无法对非唯一数据集执行ewma - 这是合理的。但是将日期添加到MultiIndex类型的残骸中,可以将其他日期的相同分钟与该分钟进行比较。

有人能想到这里的解决方案吗?

Date, Time, Venue, Volume, SummedVolume
2015-09-14, 09:30, NYSE, 1000, 10000
2015-09-14, 09:31, NYSE, 1100, 10100

df.head()在均值之前的初始输出(我将场地名称和值更改为0,因为这是敏感信息):

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')

在平均值之后从stats.head()输出:

         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

这与做一个手段(上面)到我尝试做ewma时有什么不同:

                     Volume  SummedVolume
Time  Venue
00:00 NYSE              0               0
      ARCA              0               0
      AMEX              0               0
      NASDAQ            0               0
      BATS              0               0

这是来自ewma版本的df.head()和来自ewma版本的stats.head()(它们看起来相同):

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))

1 个答案:

答案 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)