- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
编辑:我浓缩了这个问题,因为它可能太复杂了。问题的重点在下面以粗体显示。
我想了解更多有关使用 DataFrame.rolling
时实际创建的对象的信息或 Series.rolling
:
print(type(df.rolling))
<class 'pandas.core.window.Rolling'>
np.as_strided
.这个代码片段本身并不重要,但它的结果是我提出这个问题的引用点。
def rwindows(a, window):
if a.ndim == 1:
a = a.reshape(-1, 1)
shape = a.shape[0] - window + 1, window, a.shape[-1]
strides = (a.strides[0],) + a.strides
windows = np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)
return np.squeeze(windows)
rwindows
将需要 1d 或 2d
ndarray
并构建等于指定窗口大小的滚动“块”(如下所示)。
.rolling
对象与 ndarray
的比较下面输出? 它是一个迭代器,为每个块存储某些属性吗?或者完全是别的什么?我试过在对象上使用诸如
__dict__
之类的属性/方法来完成制表符完成。和
_get_index()
他们没有告诉我太多。我还看到了
_create_blocks
pandas 中的方法——它是否与
strided
相似?方法?
# as_strided version
a = np.arange(5)
print(rwindows(a, 3)) # 1d input
[[0 1 2]
[1 2 3]
[2 3 4]]
b = np.arange(10).reshape(5,2)
print(rwindows(b, 4)) # 2d input
[[[0 1]
[2 3]
[4 5]
[6 7]]
[[2 3]
[4 5]
[6 7]
[8 9]]]
func
内
pandas.core.window.Rolling.apply必须
produce a single value from an ndarray input *args and **kwargs are passed to the function
def prod(a, b):
return a * b
df.rolling(3).apply(prod, args=((df + 2).rolling(3),))
-----------------------------------------------------------------------
...
TypeError: unsupported operand type(s) for *: 'float' and 'Rolling'
.rolling
的布局有什么关系?目的?
最佳答案
我建议您查看源代码,以便深入了解滚动的作用。我特别建议你看看 rolling
generic.py 中的函数和 window.py .从那里您可以查看 Window
class如果您指定窗口类型或默认值 Rolling
class .最后一个继承自 _Rolling_and_Expanding
最终 _Rolling
和 _Window
.
也就是说,我要给我两分钱:Pandas 的整个滚动机制依赖于 numpy 函数 apply_along_axis
.特别是使用 here在 Pandas 。它与 windows.pyx
一起使用cython 模块。在你的系列中,出现了聚合滚动窗口。对于典型的聚合函数,它可以有效地为您处理它们,但对于自定义函数(使用 apply()
),它使用 roll_generic()
在 windows.pyx
.
pandas 中的滚动功能独立地对 Pandas 数据框列进行操作。它不是 python iterator , 并且是延迟加载的,这意味着在您对其应用聚合函数之前不会计算任何内容。实际应用数据滚动窗口的函数直到聚合完成之前才使用。
混淆的一个来源可能是您将滚动对象视为数据框。 (您在上一个代码片段中已将滚动对象命名为 df
)。真的不是。它是一个对象,它可以通过在它所包含的窗口逻辑上应用聚合来生成数据帧。
您提供的 lambda 应用于新数据帧的每个单元格。它在旧数据框中向后(沿着每一列)使用一个窗口,并将其聚合到新数据框中的一个单元格中。聚合可以是 sum
之类的东西, mean
,你定制的东西,等等,在一些窗口大小上,比如 3。下面是一些例子:
a = np.arange(5)
df = pd.DataFrame(a, columns=['a'])
df.rolling(3).mean().dropna()
df.rolling(3).apply(np.mean).dropna()
a
2 3.0
3 6.0
4 9.0
df.rolling(3).apply(lambda x: np.sqrt(x.dot(x))).dropna()
def euclidean_dist(x):
return np.sqrt(x.dot(x))
df.rolling(3).apply(euclidean_dist).dropna()
a
2 2.236068
3 3.741657
4 5.385165
np.sqrt(0**2 + 1**2 + 2**2)
确实是
2.236068
.
df.apply(...)
之前失败了您正在尝试添加名为
df
的滚动对象。传递给
df.apply(...)
之前的数字 2 .滚动对象不是您对其进行操作的对象。您提供的聚合函数通常也不符合聚合函数。
a
是一个包含窗口值的列表,
b
将是您传入的常量额外参数。如果您愿意,它可以是滚动对象,但通常不会是您想要做的事情。为了更清楚,这里有一些与您在原始编辑中所做的类似但有效的事情:
a = np.arange(8)
df = pd.DataFrame(a, columns=['a'])
n = 4
rol = df.rolling(n)
def prod(window_list, constant_rol):
return window_list.dot(constant_rol.sum().dropna().head(n))
rol.apply(prod, args=(rol,)).dropna()
# [92.0, 140.0, 188.0, 236.0, 284.0]
a
在您的情况下或
window_list
就我而言。所有定义的窗口,以单独列表的形式,被一一传递到该函数中。
import numpy as np
import pandas as pd
n = 3
a = np.arange(5)
df = pd.DataFrame(a, columns=['a'])
def keep(window, windows):
windows.append(window.copy())
return window[-1]
windows = list()
df['a'].rolling(n).apply(keep, args=(windows,))
df = df.tail(n)
df['a_window'] = windows
a a_window
2 2 [0.0, 1.0, 2.0]
3 3 [1.0, 2.0, 3.0]
4 4 [2.0, 3.0, 4.0]
keep
之前对其进行一些数学计算那也很好。
shift()
使用真实列:
import numpy as np
import pandas as pd
a = np.arange(5)
df = pd.DataFrame(a, columns=['a'])
for i in range(1,3):
df['a-%s' % i] = df['a'].shift(i)
df.dropna()
a a-1 a-2
2 2 1.0 0.0
3 3 2.0 1.0
4 4 3.0 2.0
b
在您的第一个代码片段中,请记住 Pandas 中的 DataFrames 通常不会作为任意维度/对象的张量处理。你可能可以把任何你想要的东西塞进去,但最终字符串、时间对象、整数和浮点数是预期的。这可能是 Pandas 的设计者没有考虑允许滚动聚合到非标量值的原因。似乎甚至不允许使用简单的字符串作为聚合函数的输出。
_create_blocks()
的最后说明滚动物体的功能。
_create_blocks()
当您使用
freq
时,函数会处理重新索引和分箱
rolling
的论据.
freq=W
:
import pandas as pd
a = np.arange(50)
df = pd.DataFrame(a, columns=['a'])
df.index = pd.to_datetime('2016-01-01') + pd.to_timedelta(df['a'], 'D')
blocks, obj, index = df.rolling(4, freq='W')._create_blocks(how=None)
for b in blocks:
print(b)
a
a
2016-01-03 2.0
2016-01-10 9.0
2016-01-17 16.0
2016-01-24 23.0
2016-01-31 30.0
2016-02-07 37.0
2016-02-14 44.0
2016-02-21 NaN
sum
并得到:
a
a
2016-01-03 NaN
2016-01-10 NaN
2016-01-17 NaN
2016-01-24 50.0
2016-01-31 78.0
2016-02-07 106.0
2016-02-14 134.0
2016-02-21 NaN
freq
作为参数,它只返回原始数据结构:
import pandas as pd
a = np.arange(5)
df = pd.DataFrame(a, columns=['a'])
blocks, obj, index = df.rolling(3)._create_blocks(how=None)
for b in blocks:
print(b)
a
a
2016-01-01 0
2016-01-02 1
2016-01-03 2
2016-01-04 3
2016-01-05 4
关于python - pandas 滚动对象如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45254174/
pandas.crosstab 和 Pandas 数据透视表似乎都提供了完全相同的功能。有什么不同吗? 最佳答案 pivot_table没有 normalize争论,不幸的是。 在 crosstab
我能找到的最接近的答案似乎太复杂:How I can create an interval column in pandas? 如果我有一个如下所示的 pandas 数据框: +-------+ |
这是我用来将某一行的一列值移动到同一行的另一列的当前代码: #Move 2014/15 column ValB to column ValA df.loc[(df.Survey_year == 201
我有一个以下格式的 Pandas 数据框: df = pd.DataFrame({'a' : [0,1,2,3,4,5,6], 'b' : [-0.5, 0.0, 1.0, 1.2, 1.4,
所以我有这两个数据框,我想得到一个新的数据框,它由两个数据框的行的克罗内克积组成。正确的做法是什么? 举个例子:数据框1 c1 c2 0 10 100 1 11 110 2 12
TL;DR:在 pandas 中,如何绘制条形图以使其 x 轴刻度标签看起来像折线图? 我制作了一个间隔均匀的时间序列(每天一个项目),并且可以像这样很好地绘制它: intensity[350:450
我有以下两个时间列,“Time1”和“Time2”。我必须计算 Pandas 中的“差异”列,即 (Time2-Time1): Time1 Time2
从这个 df 去的正确方法是什么: >>> df=pd.DataFrame({'a':['jeff','bob','jill'], 'b':['bob','jeff','mike']}) >>> df
我想按周从 Pandas 框架中的列中累积计算唯一值。例如,假设我有这样的数据: df = pd.DataFrame({'user_id':[1,1,1,2,2,2],'week':[1,1,2,1,
数据透视表的表示形式看起来不像我在寻找的东西,更具体地说,结果行的顺序。 我不知道如何以正确的方式进行更改。 df示例: test_df = pd.DataFrame({'name':['name_1
我有一个数据框,如下所示。 Category Actual Predicted 1 1 1 1 0
我有一个 df,如下所示。 df: ID open_date limit 1 2020-06-03 100 1 2020-06-23 500
我有一个 df ,其中包含与唯一值关联的各种字符串。对于这些唯一值,我想删除不等于单独列表的行,最后一行除外。 下面使用 Label 中的各种字符串值与 Item 相关联.所以对于每个唯一的 Item
考虑以下具有相同名称的列的数据框(显然,这确实发生了,目前我有一个像这样的数据集!:() >>> df = pd.DataFrame({"a":range(10,15),"b":range(5,10)
我在 Pandas 中有一个 DF,它看起来像: Letters Numbers A 1 A 3 A 2 A 1 B 1 B 2
如何减去两列之间的时间并将其转换为分钟 Date Time Ordered Time Delivered 0 1/11/19 9:25:00 am 10:58:00 am
我试图理解 pandas 中的下/上百分位数计算,但有点困惑。这是它的示例代码和输出。 test = pd.Series([7, 15, 36, 39, 40, 41]) test.describe(
我有一个多索引数据框,如下所示: TQ bought HT Detailed Instru
我需要从包含值“低”,“中”或“高”的数据框列创建直方图。当我尝试执行通常的df.column.hist()时,出现以下错误。 ex3.Severity.value_counts() Out[85]:
我试图根据另一列的长度对一列进行子串,但结果集是 NaN .我究竟做错了什么? import pandas as pd df = pd.DataFrame([['abcdefghi','xyz'],
我是一名优秀的程序员,十分优秀!