首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据前面的行计算列值

根据前面的行计算列值
EN

Stack Overflow用户
提问于 2017-07-08 23:33:55
回答 2查看 60关注 0票数 1

我想向每一行添加一个新的列Y,它将告诉我最近10个先前记录的X列val大于1的百分比次数

代码语言:javascript
复制
stock price history

   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

Resultant transformed data set

    ticker       date    adj_open ad_close    X(%)     Y(%)    
0    ABC     2017-10-06   12.10    13.11      8.0        80
1    ABC     2017-12-05   11.11    11.87      5.0        75
2    ABC     2017-12-04   12.08    11.40     -7.0       100
3    ABC     2017-12-03   12.01    13.03     10.1       100
4    ABC     2017-07-04   9.01     9.59       8.0       100
5    ABC     2017-07-03   7.89     8.19       4.0        0
EN

回答 2

Stack Overflow用户

发布于 2017-07-09 01:40:25

尝试使用try except进行simple循环,这是基于您的示例输出,尝试根据您的data修改它

代码语言:javascript
复制
n=5 #your example
df['boolean']=df['X(%)']>1
A=[]
for i in range(len(df)):
     try :
         A.append(sum(df.boolean[i+1:i+n+1])/len(df.boolean[i+1:i+n+1]))
     except:
         A.append(0)

df['Y(%)']=A


df

     ticker       date  adj_open  ad_close   X(%) boolean Y(%)
   0    ABC  10/6/2017     12.10     13.11   8.0   True  0.80
   1    ABC  12/5/2017     11.11     11.87   5.0   True  0.75
   2    ABC  12/4/2017     12.08     11.40  -7.0  False  1.00
   3    ABC  12/3/2017     12.01     13.03  10.1   True  1.00
   4    ABC   7/4/2017      9.01      9.59   8.0   True  1.00
   5    ABC   7/3/2017      7.89      8.19   4.0   True  0.00
票数 0
EN

Stack Overflow用户

发布于 2017-07-09 02:00:25

您必须:

代码语言:javascript
复制
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和一个计算所需数量的函数:

代码语言:javascript
复制
w = 2
def count_pcnt(x, window = w):
    return (np.sum(x>1)/window)*100.0

最后,让我们应用这个函数:

代码语言:javascript
复制
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

编辑

如果您愿意:

代码语言:javascript
复制
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

编辑2个

代码语言:javascript
复制
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个

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44987836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档