我有矩阵,其中第一列是UNIX时间戳
[ 1.44310344e+09 1.12127000e+00 1.12151000e+00]
[ 1.44310350e+09 1.12043000e+00 1.12115000e+00]
[ 1.44310356e+09 1.12069000e+00 1.12092000e+00]
...,
[ 1.44318942e+09 1.11952000e+00 1.11964000e+00]
[ 1.44318948e+09 1.11957000e+00 1.11979000e+00]
[ 1.44318954e+09 1.11930000e+00 1.11978000e+00]
我想要做的是找到2和3列的分钟间隔的最小值和最大值(基本上我想找到询问/出价数据的小烛台)
现在我这样做
candles = []
period = 59
for day in self.data:
print(day)
candles.append(np.empty((0, 4)))
h, o, c, l = (-np.inf, np.inf, -np.inf, np.inf)
time = day[-1, 0]
for row in np.flipud(day):
if row[0] < time-period:
time = row[0]
candles[-1] = np.append(candles[-1], [[h, o, c, l]], axis = 0)
h, o, c, l = (-np.inf, np.inf, -np.inf, np.inf)
h = max(h, row[1])
o = min(o, row[1])
c = max(c, row[2])
l = min(l, row[2])
if (h, o, c, l) != (-np.inf, np.inf, -np.inf, np.inf):
candles[-1] = np.append(candles[-1], [[h, o, c, l]], axis = 0)
但它非常丑陋。有没有更好的方法来使用numpy或熊猫?
答案 0 :(得分:1)
import pandas as pd
import numpy as np
import io
temp=u"""1.44310344e+09;1.12127000e+00;1.12151000e+00
1.44310350e+09;1.12043000e+00;1.12115000e+00
1.44310350e+09;2.12041000e+00;1.32115000e+00
1.44310350e+09;1.12043000e+00;1.12115000e+00
1.44310356e+09;1.12069000e+00;1.02092000e+00
1.44318942e+09;1.11952000e+00;1.11964000e+00
1.44318948e+09;1.11957000e+00;1.11979000e+00
1.44318954e+09;1.11930000e+00;1.11978000e+00"""
df = pd.read_csv(io.StringIO(temp), sep=";", names=['datetime','a','b'])
print df
# time a b
#0 1443103440 1.12127 1.12151
#1 1443103500 1.12043 1.12115
#2 1443103500 2.12041 1.32115
#3 1443103500 1.12043 1.12115
#4 1443103560 1.12069 1.02092
#5 1443189420 1.11952 1.11964
#6 1443189480 1.11957 1.11979
#7 1443189540 1.11930 1.11978
df['datetime'] = pd.to_datetime(df['datetime'], unit='s')
print df
# datetime a b
#0 2015-09-24 14:04:00 1.12127 1.12151
#1 2015-09-24 14:05:00 1.12043 1.12115
#2 2015-09-24 14:05:00 2.12041 1.32115
#3 2015-09-24 14:05:00 1.12043 1.12115
#4 2015-09-24 14:06:00 1.12069 1.02092
#5 2015-09-25 13:57:00 1.11952 1.11964
#6 2015-09-25 13:58:00 1.11957 1.11979
#7 2015-09-25 13:59:00 1.11930 1.11978
#convert datetime to minutes to new colum
df['minutes'] = df['datetime'].dt.minute
print df
# datetime a b minutes
#0 2015-09-24 14:04:00 1.12127 1.12151 4
#1 2015-09-24 14:05:00 1.12043 1.12115 5
#2 2015-09-24 14:05:00 2.12041 1.32115 5
#3 2015-09-24 14:05:00 1.12043 1.12115 5
#4 2015-09-24 14:06:00 1.12069 1.02092 6
#5 2015-09-25 13:57:00 1.11952 1.11964 57
#6 2015-09-25 13:58:00 1.11957 1.11979 58
#7 2015-09-25 13:59:00 1.11930 1.11978 59
#group by minutes and aggregate min and max values
g1 = df.groupby('minutes').agg({'a' : [np.min, np.max], 'b' : [np.min, np.max]})
#remove multicolumns - set new names of columns
g1.columns = ['amin','amax','bmix','bmax']
g1 = g1.reset_index()
print g1
# minutes amin amax bmix bmax
#0 4 1.12127 1.12127 1.12151 1.12151
#1 5 1.12043 2.12041 1.12115 1.32115
#2 6 1.12069 1.12069 1.02092 1.02092
#3 57 1.11952 1.11952 1.11964 1.11964
#4 58 1.11957 1.11957 1.11979 1.11979
#5 59 1.11930 1.11930 1.11978 1.11978
bins = np.arange(0,60,1)
print bins
#[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
# 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
# 50 51 52 53 54 55 56 57 58 59]
#group by bins in column minutes
g2 = df.groupby([ pd.cut(df.minutes, bins)]).agg({'a' : [np.min, np.max],
'b' : [np.min, np.max]})
#remove multicolumns - set new names of columns
g2.columns = ['amin','amax','bmix','bmax']
g2 = g2.reset_index()
print g2
# minutes amin amax bmin bmax
#0 (0, 1] NaN NaN NaN NaN
#1 (1, 2] NaN NaN NaN NaN
#2 (2, 3] NaN NaN NaN NaN
#3 (3, 4] 1.12127 1.12127 1.12151 1.12151
#4 (4, 5] 1.12043 2.12041 1.12115 1.32115
#5 (5, 6] 1.12069 1.12069 1.02092 1.02092
#6 (6, 7] NaN NaN NaN NaN
#7 (7, 8] NaN NaN NaN NaN
#8 (8, 9] NaN NaN NaN NaN
#9 (9, 10] NaN NaN NaN NaN
#10 (10, 11] NaN NaN NaN NaN
#11 (11, 12] NaN NaN NaN NaN
#12 (12, 13] NaN NaN NaN NaN
#13 (13, 14] NaN NaN NaN NaN
#14 (14, 15] NaN NaN NaN NaN
#15 (15, 16] NaN NaN NaN NaN
#16 (16, 17] NaN NaN NaN NaN
#17 (17, 18] NaN NaN NaN NaN
#18 (18, 19] NaN NaN NaN NaN
#19 (19, 20] NaN NaN NaN NaN
#20 (20, 21] NaN NaN NaN NaN
#21 (21, 22] NaN NaN NaN NaN
#22 (22, 23] NaN NaN NaN NaN
#23 (23, 24] NaN NaN NaN NaN
#24 (24, 25] NaN NaN NaN NaN
#25 (25, 26] NaN NaN NaN NaN
#26 (26, 27] NaN NaN NaN NaN
#27 (27, 28] NaN NaN NaN NaN
#28 (28, 29] NaN NaN NaN NaN
#29 (29, 30] NaN NaN NaN NaN
#30 (30, 31] NaN NaN NaN NaN
#31 (31, 32] NaN NaN NaN NaN
#32 (32, 33] NaN NaN NaN NaN
#33 (33, 34] NaN NaN NaN NaN
#34 (34, 35] NaN NaN NaN NaN
#35 (35, 36] NaN NaN NaN NaN
#36 (36, 37] NaN NaN NaN NaN
#37 (37, 38] NaN NaN NaN NaN
#38 (38, 39] NaN NaN NaN NaN
#39 (39, 40] NaN NaN NaN NaN
#40 (40, 41] NaN NaN NaN NaN
#41 (41, 42] NaN NaN NaN NaN
#42 (42, 43] NaN NaN NaN NaN
#43 (43, 44] NaN NaN NaN NaN
#44 (44, 45] NaN NaN NaN NaN
#45 (45, 46] NaN NaN NaN NaN
#46 (46, 47] NaN NaN NaN NaN
#47 (47, 48] NaN NaN NaN NaN
#48 (48, 49] NaN NaN NaN NaN
#49 (49, 50] NaN NaN NaN NaN
#50 (50, 51] NaN NaN NaN NaN
#51 (51, 52] NaN NaN NaN NaN
#52 (52, 53] NaN NaN NaN NaN
#53 (53, 54] NaN NaN NaN NaN
#54 (54, 55] NaN NaN NaN NaN
#55 (55, 56] NaN NaN NaN NaN
#56 (56, 57] 1.11952 1.11952 1.11964 1.11964
#57 (57, 58] 1.11957 1.11957 1.11979 1.11979
#58 (58, 59] 1.11930 1.11930 1.11978 1.11978