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,哇!看看时机-我很震惊。。。没想到会有这么大的不同……这是个好消息。我会尽量避免使用字符串访问器