Ai đó có thể vui lòng chỉ cho tôi đúng hướng về chuyển đổi khung thời gian dữ liệu OHLC với Pandas? Những gì tôi đang cố gắng làm là xây dựng một khung dữ liệu với dữ liệu cho khung thời gian cao hơn, được cung cấp dữ liệu với khung thời gian thấp hơn.Chuyển đổi dữ liệu chứng khoán OHLC thành một khung thời gian khác với trăn và gấu trúc
Ví dụ, cho tôi có (M1) dữ liệu sau một phút:
Open High Low Close Volume
Date
1999-01-04 10:22:00 1.1801 1.1819 1.1801 1.1817 4
1999-01-04 10:23:00 1.1817 1.1818 1.1804 1.1814 18
1999-01-04 10:24:00 1.1817 1.1817 1.1802 1.1806 12
1999-01-04 10:25:00 1.1807 1.1815 1.1795 1.1808 26
1999-01-04 10:26:00 1.1803 1.1806 1.1790 1.1806 4
1999-01-04 10:27:00 1.1801 1.1801 1.1779 1.1786 23
1999-01-04 10:28:00 1.1795 1.1801 1.1776 1.1788 28
1999-01-04 10:29:00 1.1793 1.1795 1.1782 1.1789 10
1999-01-04 10:31:00 1.1780 1.1792 1.1776 1.1792 12
1999-01-04 10:32:00 1.1788 1.1792 1.1788 1.1791 4
trong đó có Open, High, Low, Close (OHLC) và các giá trị khối lượng cho mỗi phút tôi muốn xây dựng một tập hợp các bài đọc 5 phút (M5) trong đó sẽ trông giống như vậy:
Open High Low Close Volume
Date
1999-01-04 10:25:00 1.1807 1.1815 1.1776 1.1789 91
1999-01-04 10:30:00 1.1780 1.1792 1.1776 1.1791 16
vì vậy, các quy trình làm việc là:
- mở là mở của t đầu tiên anh chèo trong timewindow
- cao là cao cao nhất trong timewindow
- thấp là thấp nhất Low
- Đóng là Close
- Khối lượng cuối cùng chỉ đơn giản là một khoản Volumes
Có có một vài vấn đề mặc dù:
- dữ liệu có khoảng trống (lưu ý không có hàng 10:30:00)
- khoảng thời gian 5 phút phải bắt đầu vào thời gian vòng, ví dụ: M5 bắt đầu lúc 10:25:00 không phải 10:22:00
- trước tiên, bộ không đầy đủ có thể được bỏ qua như trong ví dụ này hoặc được bao gồm (để chúng tôi có thể có mục nhập 10:20:00 5 phút)
Ví dụ Pandas documentation on up-down sampling đưa ra một ví dụ, nhưng chúng sử dụng giá trị trung bình làm giá trị của hàng được lấy mẫu, sẽ không hoạt động ở đây. Tôi đã thử sử dụng groupby
và agg
nhưng không có kết quả. Đối với một người nhận được cao nhất cao nhất và thấp nhất thấp có thể không phải là khó khăn như vậy, nhưng tôi không có ý tưởng làm thế nào để có được đầu tiên mở và cuối cùng gần.
Những gì tôi cố gắng là một cái gì đó dọc theo dòng:
grouped = slice.groupby(dr5minute.asof).agg(
{ 'Low': lambda x : x.min()[ 'Low' ], 'High': lambda x : x.max()[ 'High' ] }
)
nhưng nó kết quả trong báo lỗi sau, mà tôi không hiểu:
In [27]: grouped = slice.groupby(dr5minute.asof).agg({ 'Low' : lambda x : x.min()[ 'Low' ], 'High' : lambda x : x.max()[ 'High' ] })
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
/work/python/fxcruncher/<ipython-input-27-df50f9522a2f> in <module>()
----> 1 grouped = slice.groupby(dr5minute.asof).agg({ 'Low' : lambda x : x.min()[ 'Low' ], 'High' : lambda x : x.max()[ 'High' ] })
/usr/lib/python2.7/site-packages/pandas/core/groupby.pyc in agg(self, func, *args, **kwargs)
242 See docstring for aggregate
243 """
--> 244 return self.aggregate(func, *args, **kwargs)
245
246 def _iterate_slices(self):
/usr/lib/python2.7/site-packages/pandas/core/groupby.pyc in aggregate(self, arg, *args, **kwargs)
1153 colg = SeriesGroupBy(obj[col], column=col,
1154 grouper=self.grouper)
-> 1155 result[col] = colg.aggregate(func)
1156
1157 result = DataFrame(result)
/usr/lib/python2.7/site-packages/pandas/core/groupby.pyc in aggregate(self, func_or_funcs, *args, **kwargs)
906 return self._python_agg_general(func_or_funcs, *args, **kwargs)
907 except Exception:
--> 908 result = self._aggregate_named(func_or_funcs, *args, **kwargs)
909
910 index = Index(sorted(result), name=self.grouper.names[0])
/usr/lib/python2.7/site-packages/pandas/core/groupby.pyc in _aggregate_named(self, func, *args, **kwargs)
976 grp = self.get_group(name)
977 grp.name = name
--> 978 output = func(grp, *args, **kwargs)
979 if isinstance(output, np.ndarray):
980 raise Exception('Must produce aggregated value')
/work/python/fxcruncher/<ipython-input-27-df50f9522a2f> in <lambda>(x)
----> 1 grouped = slice.groupby(dr5minute.asof).agg({ 'Low' : lambda x : x.min()[ 'Low' ], 'High' : lambda x : x.max()[ 'High' ] })
IndexError: invalid index to scalar variable.
Vì vậy, bất kỳ giúp đỡ về làm đó sẽ là đánh giá cao. Nếu con đường tôi chọn sẽ không hoạt động, vui lòng đề xuất phương pháp tiếp cận tương đối hiệu quả khác (tôi có hàng triệu hàng). Một số tài nguyên sử dụng Pandas để xử lý tài chính cũng sẽ tốt đẹp.
Bạn đang sử dụng phiên bản gấu trúc nào? Chúng tôi đang làm việc trên chức năng chuỗi thời gian cải tiến sẽ đơn giản hóa quá trình này, nhưng nó không có khả năng được phát hành cho đến cuối tháng Tư hoặc lâu hơn. Có thể có một lỗi để sửa ở đây, mặc dù, quá –
Hi Wes, tôi đang sử dụng 0.7.2. Tôi đoán chờ đợi cho phiên bản mới được phát hành là một lựa chọn khả thi vì tôi không có thời hạn cho việc chuyển đổi này (tôi cần dữ liệu cho nghiên cứu riêng). Hãy để tôi sử dụng các cuộc đua để cảm ơn bạn đã đặt một nỗ lực trong việc phát triển Pandas mặc dù! :) – kgr
Và như với các lỗi tiềm năng, lưu ý rằng tôi đã không chỉ định giá trị cho tất cả các cột trong Dataframe (2 trong số 5 chỉ), nếu đó là những gì bạn có nghĩa là. – kgr