-
Notifications
You must be signed in to change notification settings - Fork 81
/
pandas_ohlc_downsampling.py
108 lines (97 loc) · 4.85 KB
/
pandas_ohlc_downsampling.py
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import pandas as pd
import pandas_datareader.data as web
df = web.DataReader('AAPL', 'iex', '2017-01-01', '2017-12-31')
df.index = pd.to_datetime(df.index)
print(df.shape)
# (251, 5)
print(df.head())
# open high low close volume
# date
# 2017-01-03 112.6732 113.1889 111.6613 113.0138 28781865
# 2017-01-04 112.7219 113.3641 112.6246 112.8873 21118116
# 2017-01-05 112.7900 113.7087 112.6830 113.4614 22193587
# 2017-01-06 113.6268 114.9695 113.3251 114.7263 31751900
# 2017-01-09 114.7652 116.2052 114.7554 115.7771 33561948
print(df.tail())
# open high low close volume
# date
# 2017-12-22 172.6967 173.4323 172.5188 173.0230 16349444
# 2017-12-26 168.8608 169.5232 167.7525 168.6334 33185536
# 2017-12-27 168.1687 168.8410 167.7831 168.6630 21498213
# 2017-12-28 169.0585 169.8988 168.5444 169.1376 16480187
# 2017-12-29 168.5839 168.6531 167.2987 167.3086 25999922
d_ohlc = {'open': 'first',
'high': 'max',
'low': 'min',
'close': 'last'}
print(df.resample('MS').agg(d_ohlc))
# open high low close
# date
# 2017-01-01 112.6732 119.1339 111.6613 118.0734
# 2017-02-01 123.6000 134.3478 123.5805 133.8690
# 2017-03-01 134.7485 141.2079 133.9276 140.3870
# 2017-04-01 140.4359 142.1460 136.8690 140.3772
# 2017-05-01 141.7942 153.7130 140.9831 149.8959
# 2017-06-01 150.2982 153.0555 139.5339 141.3198
# 2017-07-01 142.1637 151.1029 139.7400 145.9415
# 2017-08-01 154.1153 162.0694 152.1135 161.5572
# 2017-09-01 162.3453 162.4832 146.9382 151.8244
# 2017-10-01 151.9623 167.1229 150.1891 166.5221
# 2017-11-01 167.3398 173.6149 162.8181 169.8988
# 2017-12-01 168.0204 175.1881 164.5700 167.3086
print(df.resample('QS').agg(d_ohlc))
# open high low close
# date
# 2017-01-01 112.6732 141.2079 111.6613 140.3870
# 2017-04-01 140.4359 153.7130 136.8690 141.3198
# 2017-07-01 142.1637 162.4832 139.7400 151.8244
# 2017-10-01 151.9623 175.1881 150.1891 167.3086
print(df.resample('2W-MON', closed='left', label='left').agg(d_ohlc))
# open high low close
# date
# 2017-01-02 112.6732 116.6917 111.6613 115.8257
# 2017-01-16 115.1446 119.1339 115.0279 118.6572
# 2017-01-30 117.6647 129.9113 117.3631 129.1099
# 2017-02-13 130.0481 134.3478 129.7256 133.5465
# 2017-02-27 134.0156 137.0827 133.1752 135.9700
# 2017-03-13 135.6866 139.5466 135.6573 137.4358
# 2017-03-27 136.2143 142.1460 135.4618 140.0743
# 2017-04-10 140.3284 140.6012 136.8690 139.0287
# 2017-04-24 140.2307 145.5858 139.9180 145.5663
# 2017-05-08 145.6347 153.7130 145.6347 150.1903
# 2017-05-22 151.1127 152.5355 149.3660 152.5355
# 2017-06-05 151.4463 153.0555 139.5339 139.6026
# 2017-06-19 140.9665 145.4999 139.6124 141.3198
# 2017-07-03 142.1637 146.5302 139.7400 146.2457
# 2017-07-17 146.0298 151.1029 144.5383 146.6970
# 2017-07-31 147.0895 158.7959 145.3527 155.1343
# 2017-08-14 156.9469 160.0894 152.7997 157.4789
# 2017-08-28 157.7547 162.4832 156.1687 156.2672
# 2017-09-11 158.1093 161.5178 148.3174 149.6276
# 2017-09-25 147.7559 153.1739 146.9382 152.9868
# 2017-10-09 153.4892 158.4738 152.7109 153.9226
# 2017-10-23 154.5531 171.6644 152.9572 169.9306
# 2017-11-06 169.7976 173.6149 166.4682 168.2181
# 2017-11-20 168.3566 173.5074 165.2621 169.1079
# 2017-12-04 170.5217 172.1925 164.5700 171.9948
# 2017-12-18 172.8944 175.1881 167.2987 167.3086
d_ohlcv = {'open': 'first',
'high': 'max',
'low': 'min',
'close': 'last',
'volume': 'sum'}
print(df.resample('MS').agg(d_ohlcv))
# open high low close volume
# date
# 2017-01-01 112.6732 119.1339 111.6613 118.0734 563331160
# 2017-02-01 123.6000 134.3478 123.5805 133.8690 574968547
# 2017-03-01 134.7485 141.2079 133.9276 140.3870 562091214
# 2017-04-01 140.4359 142.1460 136.8690 140.3772 373290435
# 2017-05-01 141.7942 153.7130 140.9831 149.8959 654022901
# 2017-06-01 150.2982 153.0555 139.5339 141.3198 684178036
# 2017-07-01 142.1637 151.1029 139.7400 145.9415 422011831
# 2017-08-01 154.1153 162.0694 152.1135 161.5572 646894310
# 2017-09-01 162.3453 162.4832 146.9382 151.8244 680442092
# 2017-10-01 151.9623 167.1229 150.1891 166.5221 504291118
# 2017-11-01 167.3398 173.6149 162.8181 169.8988 600366443
# 2017-12-01 168.0204 175.1881 164.5700 167.3086 531184058