我有一个数据框,我想将“关闭”值存储到一天中相应的范围中。(范围=高低之差)。
我需要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的方法来完成这项任务
Stanvooz,这应该可以做到:
在审查了您的需求之后,我认为qcut将不适用于您的案例。qcut在列上工作,您所做的是在行上(至少这是我的观点)。下面的解决方案,我认为是一个更pythonic和避免循环。它对您的数据有效,没有错误消息。我正在使用pandas V1.0.1
相关问题 更多 >
编程相关推荐