在numpy中按间隔分割数组的简单方法

时间:2016-01-14 13:32:01

标签: python numpy pandas

我有矩阵,其中第一列是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或熊猫?

1 个答案:

答案 0 :(得分:1)

IIUC您可以使用groupbycutagg

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