Python 2.7 具有发生计数的时间序列滑动窗口

Python 2.7 具有发生计数的时间序列滑动窗口,python-2.7,pandas,dataframe,time-series,Python 2.7,Pandas,Dataframe,Time Series,我正在尝试获取两个时间戳值之间的计数: 例如: time letter 1 A 4 B 5 C 9 C 18 B 30 A 30 B 我正在划分时间窗口:1+30/30 然后我想知道大小为1的每个时间窗口中有多少个A B C timeseries A B C 1 1 0 0 2 0 0 0 ... 30 1 1 0 这应该给我一个30

我正在尝试获取两个时间戳值之间的计数:

例如:

time    letter
  1     A
  4     B
  5     C
  9     C
  18    B
  30    A
  30    B
我正在划分时间窗口:1+30/30 然后我想知道大小为1的每个时间窗口中有多少个A B C

timeseries  A  B  C
1           1  0  0
2           0  0  0
...
30          1  1  0
这应该给我一个30行3列的表格:a B C的视力

问题是数据分解需要很长时间,因为它每次都会遍历所有主表来切片数据,即使数据已经排序

master = mytable  

minimum = master.timestamp.min()
maximum = master.timestamp.max()

window = (minimum + maximum) / maximum

wstart = minimum
wend = minimum + window

concurrent_tasks = []

while ( wstart <= maximum ):
    As = 0
    Bs = 0
    Cs = 0
    for d, row in master.iterrows():
        ttime = row.timestamp
        if ((ttime >= wstart) & (ttime < wend)):
            #print (row.channel)
            if (row.channel == 'A'):
                As = As + 1
            elif (row.channel == 'B'):
                Bs = Bs + 1
            elif (row.channel == 'C'):
                Cs = Cs + 1


    concurrent_tasks.append([m_id, As, Bs, Cs])

    wstart = wstart + window
    wend = wend + window
master=mytable
最小值=master.timestamp.min()
最大值=master.timestamp.max()
窗口=(最小值+最大值)/最大值
wstart=最小值
wend=最小值+窗口
并发_任务=[]
而(wstart=wstart)和(ttime
你能帮我把这个做得更好吗?我想使用map函数,我想防止python每次都在所有循环中循环

这是大数据的一部分,需要几天才能完成


谢谢

有一种更快的方法-:

如果要按
时间对其进行“压缩”(分组)

In [146]: pd.get_dummies(df.set_index('time')['letter']).groupby(level=0).sum()
Out[146]:
      A  B  C
time
1     1  0  0
4     0  1  0
5     0  0  1
9     0  0  1
18    0  1  0
30    1  1  0
或使用:

结果:

In [143]: r
Out[143]:
    A  B  C
1   1  0  0
4   0  1  0
5   0  0  1
9   0  0  1
18  0  1  0
30  1  1  0
如果要列出从
1
30
的所有
时间

In [153]: r.reindex(np.arange(r.index.min(), r.index.max()+1)).fillna(0).astype(np.int8)
Out[153]:
    A  B  C
1   1  0  0
2   0  0  0
3   0  0  0
4   0  1  0
5   0  0  1
6   0  0  0
7   0  0  0
8   0  0  0
9   0  0  1
10  0  0  0
11  0  0  0
12  0  0  0
13  0  0  0
14  0  0  0
15  0  0  0
16  0  0  0
17  0  0  0
18  0  1  0
19  0  0  0
20  0  0  0
21  0  0  0
22  0  0  0
23  0  0  0
24  0  0  0
25  0  0  0
26  0  0  0
27  0  0  0
28  0  0  0
29  0  0  0
30  1  1  0
或使用熊猫方法:

In [159]: pd.get_dummies(df.set_index('time')['letter']) \
     ...:   .groupby(level=0) \
     ...:   .sum() \
     ...:   .reindex(np.arange(r.index.min(), r.index.max()+1), fill_value=0)
     ...:
Out[159]:
      A  B  C
time
1     1  0  0
2     0  0  0
3     0  0  0
4     0  1  0
5     0  0  1
6     0  0  0
7     0  0  0
8     0  0  0
9     0  0  1
10    0  0  0
...  .. .. ..
21    0  0  0
22    0  0  0
23    0  0  0
24    0  0  0
25    0  0  0
26    0  0  0
27    0  0  0
28    0  0  0
29    0  0  0
30    1  1  0

[30 rows x 3 columns]
更新:

时间:

In [163]: df = pd.concat([df] * 10**4, ignore_index=True)

In [164]: %timeit pd.get_dummies(df.set_index('time')['letter'])
100 loops, best of 3: 10.9 ms per loop

In [165]: %timeit df.set_index('time').letter.str.get_dummies()
1 loop, best of 3: 914 ms per loop

有一种更快的方法-:

如果要按
时间对其进行“压缩”(分组)

In [146]: pd.get_dummies(df.set_index('time')['letter']).groupby(level=0).sum()
Out[146]:
      A  B  C
time
1     1  0  0
4     0  1  0
5     0  0  1
9     0  0  1
18    0  1  0
30    1  1  0
或使用:

结果:

In [143]: r
Out[143]:
    A  B  C
1   1  0  0
4   0  1  0
5   0  0  1
9   0  0  1
18  0  1  0
30  1  1  0
如果要列出从
1
30
的所有
时间

In [153]: r.reindex(np.arange(r.index.min(), r.index.max()+1)).fillna(0).astype(np.int8)
Out[153]:
    A  B  C
1   1  0  0
2   0  0  0
3   0  0  0
4   0  1  0
5   0  0  1
6   0  0  0
7   0  0  0
8   0  0  0
9   0  0  1
10  0  0  0
11  0  0  0
12  0  0  0
13  0  0  0
14  0  0  0
15  0  0  0
16  0  0  0
17  0  0  0
18  0  1  0
19  0  0  0
20  0  0  0
21  0  0  0
22  0  0  0
23  0  0  0
24  0  0  0
25  0  0  0
26  0  0  0
27  0  0  0
28  0  0  0
29  0  0  0
30  1  1  0
或使用熊猫方法:

In [159]: pd.get_dummies(df.set_index('time')['letter']) \
     ...:   .groupby(level=0) \
     ...:   .sum() \
     ...:   .reindex(np.arange(r.index.min(), r.index.max()+1), fill_value=0)
     ...:
Out[159]:
      A  B  C
time
1     1  0  0
2     0  0  0
3     0  0  0
4     0  1  0
5     0  0  1
6     0  0  0
7     0  0  0
8     0  0  0
9     0  0  1
10    0  0  0
...  .. .. ..
21    0  0  0
22    0  0  0
23    0  0  0
24    0  0  0
25    0  0  0
26    0  0  0
27    0  0  0
28    0  0  0
29    0  0  0
30    1  1  0

[30 rows x 3 columns]
更新:

时间:

In [163]: df = pd.concat([df] * 10**4, ignore_index=True)

In [164]: %timeit pd.get_dummies(df.set_index('time')['letter'])
100 loops, best of 3: 10.9 ms per loop

In [165]: %timeit df.set_index('time').letter.str.get_dummies()
1 loop, best of 3: 914 ms per loop

上的填充值=0reindex@piRSquared是的,我总是忘记这个参数。非常感谢!:)不确定哪一个更快,但这也应该有效。df.set_index('time').letter.str.get_dummies()。很可能是你的。@piRSquared,哇!看看时机-我很震惊。。。没想到会有这么大的不同……这是个好消息。当我可以在上填充_value=0时,我将避免使用字符串访问器reindex@piRSquared是的,我总是忘记这个参数。非常感谢!:)不确定哪一个更快,但这也应该有效。df.set_index('time').letter.str.get_dummies()。很可能是你的。@piRSquared,哇!看看时机-我很震惊。。。没想到会有这么大的不同……这是个好消息。我会尽量避免使用字符串访问器