Có một vài cách tiếp cận. Sử dụng apply
:
>>> df = pd.read_csv("bondstack.csv")
>>> df["shift"] = df["open"].shift(-1)
>>> df["b"] = df.apply(lambda row: row["shift"] if row["MA10"] > row["MA100"] else np.nan, axis=1)
trong đó sản xuất
>>> df[["MA10", "MA100", "shift", "b"]][:10]
MA10 MA100 shift b
0 16.915625 17.405625 16.734375 NaN
1 16.871875 17.358750 17.171875 NaN
2 16.893750 17.317187 17.359375 NaN
3 16.950000 17.279062 17.359375 NaN
4 17.137500 17.254062 18.640625 NaN
5 17.365625 17.229063 18.921875 18.921875
6 17.550000 17.200312 18.296875 18.296875
7 17.681250 17.177500 18.640625 18.640625
8 17.812500 17.159375 18.609375 18.609375
9 17.943750 17.142813 18.234375 18.234375
Đối với một cách tiếp cận vectorized hơn, bạn có thể sử dụng
>>> df = pd.read_csv("bondstack.csv")
>>> df["b"] = np.nan
>>> df["b"][df["MA10"] > df["MA100"]] = df["open"].shift(-1)
hoặc phương pháp ưa thích của tôi:
>>> df = pd.read_csv("bondstack.csv")
>>> df["b"] = df["open"].shift(-1).where(df["MA10"] > df["MA100"])
Nếu bạn muốn sử dụng kết quả của danh sách hiểu như một chỉ số, bạn nên sử dụng: 'df [[x cho x trong df ['shift'] nếu df ["MA10"]> df ["MA100"]]] ', nhưng tôi nghĩ điều này sẽ làm tăng một số ngoại lệ. Vui lòng gửi dữ liệu mẫu của bạn và kết quả mong muốn. – HYRY
@HYRY Cảm ơn bạn đã bình luận. Tôi đã đăng liên kết đến dữ liệu mẫu của mình. Tôi đã sử dụng đề xuất của bạn trước khi đăng và nhận được lỗi "cú pháp không hợp lệ" như tôi đã đề cập. –
@ user1374969: đếm số lượng dấu ngoặc trong đề xuất của HYRY và sau đó đếm số trong ngoặc đơn của bạn. – DSM