当前位置: 首页 > 面试题库 >

计算数据帧组内的差异

沈永贞
2023-03-14
问题内容

假设我有一个包含3列的数据框:日期,股票行情,值(无索引,至少从此开始)。我有很多约会,很多股票,但是每个(ticker,date)元组都是唯一的。(但是很显然,同一日期将显示在多行中,因为它将在多个行情中出现,而同一行情显示将在多行中显示,因为它将存在许多日期。)

最初,我的行以特定顺序排列,但没有按任何列进行排序。

我想计算每个股票报价的第一个差异(每日变化)(按日期排序),并将其放在数据框中的新列中。在这种情况下,我 不能 简单地做

df['diffs'] = df['value'].diff()

因为相邻的行不是来自同一行情自动收录器。排序如下:

df = df.sort(['ticker', 'date'])
df['diffs'] = df['value'].diff()


解决这个问题,因为将有“边界”。即在该排序之后,一个股票行情的最后一个值将高于下一个股票行情的第一个值。然后,计算差异将需要两个代码之间的差异。我不要这个
我希望每个股票的最早日期NaN在其diff列中结束。

这似乎是一个明显的使用时间,groupby但是由于某种原因,我似乎无法使其正常工作。明确地说,我想执行以下过程:

  1. 根据行对行进行分组 ticker
  2. 在每个组中,按行对行进行排序 date
  3. 在每个已排序的组中,计算value列的差异
  4. 将这些差异放入新diffs列中的原始数据帧中(最好保持原始数据帧顺序不变)。

我必须想象这是单线的。但是我想念什么?

在2013-12-17 9:00 pm编辑

好吧…有些进步。我可以执行以下操作以获取新的数据框:

result = df.set_index(['ticker', 'date'])\
    .groupby(level='ticker')\
    .transform(lambda x: x.sort_index().diff())\
    .reset_index()

但是,如果我了解groupby的机制,ticker那么现在我的行​​将首先按排序,然后按排序date。那是对的吗?如果是这样,我是否需要进行合并以将差分列追加到当前result['current']的原始数据帧中df


问题答案:

做您自己描述的事情并不容易,即

df.sort(['ticker', 'date'], inplace=True)
df['diffs'] = df['value'].diff()

然后校正边界:

mask = df.ticker != df.ticker.shift(1)
df['diffs'][mask] = np.nan

维护您可能会idx = df.index在开始时执行的原始索引,然后在结束时可以执行df.reindex(idx),或者如果它是一个巨大的数据帧,请在

df.filter(['ticker', 'date', 'value'])

然后join是最后两个数据框。

编辑 :或者,(尽管仍然不使用groupby

df.set_index(['ticker','date'], inplace=True)
df.sort_index(inplace=True)
df['diffs'] = np.nan

for idx in df.index.levels[0]:
    df.diffs[idx] = df.value[idx].diff()

对于

   date ticker  value
0    63      C   1.65
1    88      C  -1.93
2    22      C  -1.29
3    76      A  -0.79
4    72      B  -1.24
5    34      A  -0.23
6    92      B   2.43
7    22      A   0.55
8    32      A  -2.50
9    59      B  -1.01

这将产生:

             value  diffs
ticker date              
A      22     0.55    NaN
       32    -2.50  -3.05
       34    -0.23   2.27
       76    -0.79  -0.56
B      59    -1.01    NaN
       72    -1.24  -0.23
       92     2.43   3.67
C      22    -1.29    NaN
       63     1.65   2.94
       88    -1.93  -3.58


 类似资料:
  • 我需要按行比较两个不同大小的数据帧,并打印出不匹配的行。让我们看以下两个例子: 在df2上按行打印并打印出不在df1中的行的最有效方法是什么。 重要提示:我不希望有行: 包括在差异中: 我已经尝试过了:逐行比较两个不同长度的数据帧,为每行添加相等值的列,比较两个数据帧,并排输出它们的差异 但是这些和我的问题不匹配。

  • 假设我有以下数据帧: 我想计算每个的不同值的数量。它应产生以下结果: 我该怎么做?

  • 我有三个数据帧,并试图计算由数据帧1调节的两个数据帧(Df2和Df3)之间的差值。如下面的示例所解释的,我有三个数据帧,Df1、Df2和Df3,它们具有共同的名称。第一步,在Df1中,我想比较“Standard”列和所有三列的值,“das”、“dss”和“tri”可能是行的,并且当这些列的任何值,“das”、“dss”和“tri”高于Df1中的“Standard”时,计算Df2和Df3中相同位置的

  • 示例数据: 我想计算每个唯一列名称的平均值和标准偏差(忽略NA)以获得如下输出: 可再现数据: 我得到的最接近的是 这是我从这篇文章中得到的,但我不知道如何调整它来得到我想要的。我知道我可以取rowmeans的平均值来得到每组的平均值,但这不适用于标准差。

  • 问题内容: 我试图计算两个日期之间的差额,但我注意到一件事。仅计算日期时,间隔中包括夏令时的开始,因此结果将缩短1天。 为了获得准确的结果,还必须考虑小时数。 例如: 输出: 有人有更好的解决方案吗? 问题答案: 哦,是的,有更好的解决方案! 停止使用过时的类,并使用Java 8及更高版本(教程)中内置的java.time API的功能 。具体而言,,,和类。

  • 我遵循了此处提出的计算循环数据平均值的建议: https://en.wikipedia.org/wiki/Mean_of_circular_quantities 但是我也想计算均方差。 上面给出了平均值,但我不知道如何计算SD 我试着只取正弦和余弦的标准偏差的平均值,但我得到了不同的答案。