您有:
df
ticker date adj_open ad_close X(%)
0 ABC 2017-10-06 12.10 13.11 8.0
1 ABC 2017-12-05 11.11 11.87 5.0
2 ABC 2017-12-04 12.08 11.40 -7.0
3 ABC 2017-12-03 12.01 13.03 10.1
4 ABC 2017-07-04 9.01 9.59 8.0
5 ABC 2017-07-03 7.89 8.19 4.0
讓我們定義window
和,將計算所需量的函數:
w = 2
def count_pcnt(x, window = w):
return (np.sum(x>1)/window)*100.0
最後,讓我們應用功能:
df["Y(%)"] = df["X(%)"].rolling(window=w).apply(count_pcnt)
df
ticker date adj_open ad_close X(%) Y(%)
0 ABC 2017-10-06 12.10 13.11 8.0 NaN
1 ABC 2017-12-05 11.11 11.87 5.0 100.0
2 ABC 2017-12-04 12.08 11.40 -7.0 50.0
3 ABC 2017-12-03 12.01 13.03 10.1 50.0
4 ABC 2017-07-04 9.01 9.59 8.0 100.0
5 ABC 2017-07-03 7.89 8.19 4.0 100.0
您可以更改w
到10
,你有更多數據。
編輯
如果你想:
w=4
df["Y(%)"] = df["X(%)"].rolling(window=w).apply(lambda x: count_pcnt(x, window = w))
df
ticker date adj_open ad_close X(%) Y(%)
0 ABC 2017-10-06 12.10 13.11 8.0 NaN
1 ABC 2017-12-05 11.11 11.87 5.0 NaN
2 ABC 2017-12-04 12.08 11.40 -7.0 NaN
3 ABC 2017-12-03 12.01 13.03 10.1 75.0
4 ABC 2017-07-04 9.01 9.59 8.0 75.0
5 ABC 2017-07-03 7.89 8.19 4.0 75.0
EDIT 2
w=4 # specify the desired window
df["Y(%)"] = df["X(%)"].rolling(window=w).apply(lambda x: (np.sum(x>1)/x.shape[0])* 100.0)
編輯3
w=4
df["Y(%)"] = df["X(%)"].rolling(window=w
,min_periods = 0).apply(lambda x: (np.sum(x>1)/x.shape[0])* 100.0)
df
ticker date adj_open ad_close X(%) Y(%)
0 ABC 2017-10-06 12.10 13.11 8.0 100.000000
1 ABC 2017-12-05 11.11 11.87 5.0 100.000000
2 ABC 2017-12-04 12.08 11.40 -7.0 66.666667
3 ABC 2017-12-03 12.01 13.03 10.1 75.000000
4 ABC 2017-07-04 9.01 9.59 8.0 75.000000
5 ABC 2017-07-03 7.89 8.19 4.0 75.000000
這裏的解決方案可能涉及到'DataFrame.rolling' https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.rolling.html – cmaher