Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在同一列中将单个数据帧值与前10个值进行比较_Python_Pandas_Conditional_Dataframe_Vectorization - Fatal编程技术网

Python 在同一列中将单个数据帧值与前10个值进行比较

Python 在同一列中将单个数据帧值与前10个值进行比较,python,pandas,conditional,dataframe,vectorization,Python,Pandas,Conditional,Dataframe,Vectorization,在一个数据框中,我想计算一下前10天的价格中有多少高于今天的价格。结果如下所示: price ct>prev10 50.00 51.00 52.00 50.50 51.00 50.00 50.50 53.00 52.00 49.00 51.00 3 我已经看到DSM回答了这篇文章,但要求不同,因为比较的基础是一个静态数字,而不是当前行: 当然,我不想在1x1中循环。非常困惑-提前感谢您的建议 您可以对该系列使用滚动应用

在一个数据框中,我想计算一下前10天的价格中有多少高于今天的价格。结果如下所示:

price   ct>prev10
50.00   
51.00   
52.00   
50.50   
51.00   
50.00   
50.50   
53.00   
52.00   
49.00   
51.00   3
我已经看到DSM回答了这篇文章,但要求不同,因为比较的基础是一个静态数字,而不是当前行:


当然,我不想在1x1中循环。非常困惑-提前感谢您的建议

您可以对该系列使用
滚动应用
功能。我使用了一个窗口长度为5的小规模的样本数据,但你可以很容易地改变它

lambda
函数统计滚动组中的项目数(不包括最后一个项目)大于最后一个项目

df = pd.DataFrame({'price': [50, 51, 52, 50.5, 51, 50, 50.5, 53, 52, 49, 51]})

window = 5  # Given that sample data only contains 11 values.
df['price_count'] = pd.rolling_apply(df.price, window, 
                                     lambda group: sum(group[:-1] > group[-1]))
>>> df
    price  price_count
0    50.0          NaN
1    51.0          NaN
2    52.0          NaN
3    50.5          NaN
4    51.0            1
5    50.0            4
6    50.5            2
7    53.0            0
8    52.0            1
9    49.0            4
10   51.0            2
在上面的例子中,第一组是指数值为0-4的价格。您可以看到发生了什么:

group = df.price[:window].values
>>> group
array([ 50. ,  51. ,  52. ,  50.5,  51. ])
现在,将前四种价格与当前价格进行比较:

>>> group[:-1] > group[-1]
array([False, False,  True, False], dtype=bool)
然后,将布尔值相加:

>>> sum(group[:-1] > group[-1])
1

这是在索引4的第一个关闭窗口中输入的值。

这是一个向量化方法,模块支持实现向量化方法-

import numpy as np
import pandas as pd

# Sample input dataframe
df = pd.DataFrame({'price': [50, 51, 52, 50.5, 51, 50, 50.5, 53, 52, 49, 51]})

# Convert to numpy array for counting purposes
A = np.array(df['price'])

W = 5 # Window size

# Initialize another column for storing counts
df['price_count'] = np.nan

# Get counts and store as a new column in dataframe
C = (A[np.arange(A.size-W+1)[:,None] + np.arange(W-1)] > A[W-1:][:,None]).sum(1)
df['price_count'][W-1:] = C
样本运行-

>>> df
    price
0    50.0
1    51.0
2    52.0
3    50.5
4    51.0
5    50.0
6    50.5
7    53.0
8    52.0
9    49.0
10   51.0
>>> A = np.array(df['price'])
>>> W = 5 # Window size
>>> df['price_count'] = np.nan
>>> 
>>> C=(A[np.arange(A.size-W+1)[:,None] + np.arange(W-1)] > A[W-1:][:,None]).sum(1)
>>> df['price_count'][W-1:] = C
>>> df
    price  price_count
0    50.0          NaN
1    51.0          NaN
2    52.0          NaN
3    50.5          NaN
4    51.0            1
5    50.0            4
6    50.5            2
7    53.0            0
8    52.0            1
9    49.0            4
10   51.0            2

嗨,亚历山大,谢谢你的快速反应。我相信这正是我需要的,但我还没有完全理解。如果我希望回溯期为5天,不包括今天,我将如何调整您所写的内容?我知道我可以将window=6,但为了更好地理解您的解决方案,它是否为:pd.rolling_apply(df.price,window,lambda group:sum(group[:-1]>group[-2])?窗口的最后一天被排除在比较之外。请参见上面的编辑。