我有一个数据框,我想将“接近”值分组到当天的相应范围内。 (范围=高低差)。
我需要 5 个分位数。 Q1、Q2、M、Q4、Q5。
示例:最低价 100、最高价 200、收盘价 125 = 第二季度
这是 df:
Low High range close
amin amax
Date
2019-06-20 2918.00 2946.75 115.0 2943.00
2019-06-21 2930.00 2951.50 86.0 2933.25
2019-06-24 2931.00 2944.00 52.0 2934.50
2019-06-25 2902.25 2935.25 132.0 2903.50
2019-06-26 2899.00 2921.25 89.0 2900.25
2019-06-27 2900.00 2918.00 72.0 2913.25
2019-06-28 2913.00 2937.50 98.0 2937.00
2019-07-01 2937.75 2964.00 105.0 2950.50
2019-07-02 2940.75 2962.25 86.0 2962.00
2019-07-03 2957.75 2983.75 104.0 2983.25
2019-07-04 2979.50 2986.00 26.0 2984.50
2019-07-05 2953.50 2986.25 131.0 2972.75
2019-07-08 2955.50 2971.00 62.0 2960.50
2019-07-09 2945.75 2968.50 91.0 2964.50
2019-07-10 2953.50 2989.75 145.0 2988.50
我正在尝试通过循环来完成此任务。数组将被填充,但我无法将值分配给数据框。
low = df.loc[:, ('Low', 'amin')]
def q():
qarray = []
for i in range(len(df)):
if ((df.close[i] - low[i])/0.25)/df.range[i]*100 > 0 and ((df.close[i] - low[i])/0.25)/df.range[i]*100 <= 20:
qarray.append('Q1')
if ((df.close[i] - low[i])/0.25)/df.range[i]*100 > 20 and ((df.close[i] - low[i])/0.25)/df.range[i]*100 <= 40:
qarray.append('Q2')
if ((df.close[i] - low[i])/0.25)/df.range[i]*100 > 40 and ((df.close[i] - low[i])/0.25)/df.range[i]*100 <= 60:
qarray.append('M')
if ((df.close[i] - low[i])/0.25)/df.range[i]*100 > 60 and ((df.close[i] - low[i])/0.25)/df.range[i]*100 <= 80:
qarray.append('Q4')
if ((df.close[i] - low[i])/0.25)/df.range[i]*100 > 80:
qarray.append('Q5')
return qarray
df['q'] = q()
我收到此警告消息:
/opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:23: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
如何将 qarray 中的值获取到数据帧?还有,有没有一种更Python式的方法来完成这个任务?
最佳答案
Stanvooz,这应该可以做到:
df["q"] = pd.qcut((df["close"] - df["low"]), q=[0, 0.2, 0.4, 0.6, 0.8, 1], labels=["Q1", "Q2", "M", "Q3", "Q4"])
查看您的要求后,我认为 qcut 不适用于您的情况。 qcut 适用于列,您正在做的是行(至少这是我的观点)。我认为下面的解决方案更加Pythonic并且避免了循环。它对我来说适用于您的数据,没有错误消息。我正在使用 pandas v 1.0.1
_ranges = np.array([0, 20, 40, 60, 80, 100])
_map = {1: "Q1", 2: "Q2", 3: "M", 4: "Q4", 5: "Q5"} # maps label to an appropriate range
df["derive"] = ((df["close"].values - df["low"].values) / 0.25) / df["range"].values * 100 # intermediate step
df["q"] = df["derive"].apply(lambda x: _map[(x > _ranges).sum()])
df.drop("derive", axis=1, inplace=True)
关于python - 如何使用单独的值范围对 pandas 数据框中的值进行分位数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62942815/