【问题标题】:looking for better iteration approach for slicing a dataframe寻找更好的迭代方法来切片数据帧
【发布时间】:2021-10-24 05:15:46
【问题描述】:

第一篇文章:我为草率的措辞提前道歉(如果这个问题在其他地方得到了令人作呕的回答,可能搜索不佳 - 也许我还不知道正确的搜索词)。

我有 10 分钟块中的数据,我想对按分钟分组的列(“输入”)执行计算(即 10 个单独的 60 秒块 - 不是滚动的 60 秒周期),然后存储所有十个计算在一个称为输出的列表中。

“秒”列记录 10 分钟内从 1 到 600 的秒数。如果在给定的秒数内没有输入数据,则该秒数没有行。所以,有些分钟有 60 行数据,有些只有一两行。

注意:计算 (my_function) 不是基本的,所以我不能使用 groupby 和 np.sum()、np.mean() 等 - 或者至少我不知道如何使用 groupby。

我有可以完成工作的代码,但它看起来很难看,所以我确信有更好的方法(可能有几个)。

output=[]

seconds_slicer = 0

for i in np.linspace(1,10,10):
    seconds_slicer += 60
    minute_slice = df[(df['seconds'] > (seconds_slicer - 60)) & 
                             (df['seconds'] <= seconds_slicer)]
    calc = my_function(minute_slice['input'])
    output.append(calc)

如果有更简洁的方法可以做到这一点,请告诉我。谢谢!

编辑:添加示例数据和函数详细信息:

seconds input
1   1   0.000054
2   2   -0.000012
3   3   0.000000
4   4   0.000000
5   5   0.000045

def realized_volatility(series_log_return):
    return np.sqrt(np.sum(series_log_return**2))

【问题讨论】:

  • 查看您的函数的作用,或一些示例输入和预期输出将有助于我们了解您的问题的性质。从表面上看,它看起来很像在 pandas 中进行标准重采样,这个链接有帮助吗? Pandas Resample Apply Custom Function?
  • 我试图在不将秒列转换为日期时间的情况下执行此操作(但也许这就是我应该做的)。我即将在原始帖子中添加数据样本和函数的详细信息。最初我把函数细节省略了,因为我专注于切片,不想把细节弄得乱七八糟。

标签: python numpy iteration slice


【解决方案1】:

对于这个答案,我们将重新利用 Bin pandas dataframe by every X rows

我们将在“秒”列中创建一个缺少数据的数据框,因为我理解您的数据基于给出的描述

secs=[1,2,3,4,5,6,7,8,9,11,12,14,15,17,19]
data = [np.random.randint(-25,54)/100000 for _ in range(15)]

df=pd.DataFrame(data=zip(secs,data), columns=['seconds','input'])

df

    seconds input
0   1   0.00017
1   2   -0.00020
2   3   0.00033
3   4   0.00052
4   5   0.00040
5   6   -0.00015
6   7   0.00001
7   8   -0.00010
8   9   0.00037
9   11  0.00050
10  12  0.00000
11  14  -0.00009
12  15  -0.00024
13  17  0.00047
14  19  -0.00002

我没有创建 600 行,但这没关系,我们会说我们希望每 5 秒而不是每 60 秒进行一次装箱。现在,因为我们只是尝试使用相等的时间度量进行分组,所以我们可以使用地板除法来查看每个时间间隔 最终进入哪个 bin。(在您的情况下,您应该除以 60)

grouped=df.groupby(df['seconds'] // 5).apply(realized_volatility).drop('seconds', axis=1) #we drop the extra 'seconds' column because we don;t care about the root sum of squares of seconds in the df

grouped

        input
seconds 
0       0.000441
1       0.000372
2       0.000711
3       0.000505

【讨论】:

  • 非常好的解决方案。谢谢!
  • 很高兴为您提供帮助,感谢您提供示例信息以便我可以提供帮助
猜你喜欢
  • 2018-03-07
  • 1970-01-01
  • 1970-01-01
  • 2021-01-08
  • 2016-10-21
  • 2020-12-06
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
相关资源
最近更新 更多