如何使用单个值范围对数据帧中的值进行分位数

2024-09-29 23:26:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据框,我想将“关闭”值存储到一天中相应的范围中。(范围=高低之差)。
我需要5个分位数。Q1、Q2、M、Q4、Q5.
示例:低100,高200,收盘125=Q2

这是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的方法来完成这项任务


Tags: and数据dfcloseifrangelowappend
1条回答
网友
1楼 · 发布于 2024-09-29 23:26:01

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 V1.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)

相关问题 更多 >

    热门问题