Pandas数据帧在没有for循环的行上迭代

2024-10-02 04:27:24 发布

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

我有一个大约300万行的数据帧,看起来像:

   date        size  price
0  2018-08-01  100   220
1  2018-08-01  110   245
2  2018-08-01  125   250
3  2018-08-02  110   210
4  2018-08-02  120   230
5  2018-08-02  150   260
6  2018-08-03  115   200

对于每一行,它是一个项目的事务。我们有交易日期,商品的大小和价格。在

现在我想添加一个名为avg_price的列,这样一个事务/行的平均价格是最后一天的k个事务的平均值,这些事务的大小与这个最接近(非常类似k近邻的概念)。在

例如,当k=2时,上面最后一行的平均价格应该是(210+230)/2=220,因为最近的两个交易的大小分别是110和120,对应的价格是210和230。在

预期产出应为:

^{pr2}$

我编写了一个for循环来遍历每一行,首先挑选出最后一天的所有事务,然后根据大小的差异进行排序,并计算前k项的平均值。然而,正如预期的那样,这是极其缓慢的。有人能指出一种更“矢量化”的方法吗?谢谢。在

更新:每天的交易数量不是固定的,大约在300左右。在


Tags: 数据项目概念forsizedate价格交易
2条回答

我不确定您的预期输出是什么,但是如果您想找到具有多个事务的日期上最接近大小的平均值,您可以这样做。如果您正在寻找其他内容,请提供预期输出:

df = pd.read_clipboard()

# find the diff on the size column and backfill the NaN values
df['diff'] = df.groupby('date')['size'].diff().fillna(method='bfill')

# group by date and use the lambda function to find the min diff
df2 = df.groupby(['date']).apply(lambda x: x[x['diff'] == x['diff'].min()])

# find the mean of price
df2.groupby('date')['price'].mean()

date
2018-08-01    232.5
2018-08-02    220.0
Name: price, dtype: float64

我调用了dfa原始数据帧。首先在dfb中创建以后^{}所需的数据

k = 2 # should work for any number
dfb = dfa.copy()
dfb = dfb.sort_values(['date','size']) #actually need in dfa too
# get the k-mean
dfb['avg_price'] = dfb.groupby('date').price.rolling(k).mean().values
#to look for the k nearest sizes in merge_asof
dfb['size'] = dfb.groupby('date')['size'].rolling(k).mean().values
# add one business day to shift all the date 
dfb['date'] = dfb['date'] + pd.tseries.offsets.BDay() 
dfb = dfb.dropna().drop('price',1)
dfb['size'] = dfb['size'].astype(int) #needed for the merge_asof
print (dfb)

        date   size  avg_price
1 2018-08-02    105      232.5
2 2018-08-02    117      247.5
4 2018-08-03    115      220.0
5 2018-08-03    135      245.0

您可以使用merge_asof,通过datenearest size(使用该方法需要sort_values):

^{pr2}$

结果是dfa

        date  price  size  avg_price
0 2018-08-01    220   100        NaN
1 2018-08-01    245   110        NaN
2 2018-08-01    250   125        NaN
3 2018-08-02    210   110      232.5
4 2018-08-02    230   120      247.5
5 2018-08-02    260   150      247.5
6 2018-08-03    200   115      220.0

相关问题 更多 >

    热门问题