我的动机是利用熊猫rolling
功能来进行滚动多因素回归(这个问题是 不是
关于滚动多因素回归)。我希望我可以apply
在a之后使用,df.rolling(2)
并使用所得结果pd.DataFrame
提取ndarray.values
并执行必要的矩阵乘法。那样行不通。
这是我发现的:
import pandas as pd
import numpy as np
np.random.seed([3,1415])
df = pd.DataFrame(np.random.rand(5, 2).round(2), columns=['A', 'B'])
X = np.random.rand(2, 1).round(2)
对象是什么样的:
print "\ndf = \n", df
print "\nX = \n", X
print "\ndf.shape =", df.shape, ", X.shape =", X.shape
df =
A B
0 0.44 0.41
1 0.46 0.47
2 0.46 0.02
3 0.85 0.82
4 0.78 0.76
X =
[[ 0.93]
[ 0.83]]
df.shape = (5, 2) , X.shape = (2L, 1L)
矩阵乘法的行为正常:
df.values.dot(X)
array([[ 0.7495],
[ 0.8179],
[ 0.4444],
[ 1.4711],
[ 1.3562]])
使用Apply执行逐行点积的行为符合预期:
df.apply(lambda x: x.values.dot(X)[0], axis=1)
0 0.7495
1 0.8179
2 0.4444
3 1.4711
4 1.3562
dtype: float64
Groupby-> Apply的行为符合我的预期:
df.groupby(level=0).apply(lambda x: x.values.dot(X)[0, 0])
0 0.7495
1 0.8179
2 0.4444
3 1.4711
4 1.3562
dtype: float64
但是当我跑步时:
df.rolling(1).apply(lambda x: x.values.dot(X))
我得到:
AttributeError:“ numpy.ndarray”对象没有属性“ values”
好的,所以熊猫ndarray
在其rolling
实现中直接使用了。我可以解决。而不是使用.values
来获得ndarray
,让我们试试:
df.rolling(1).apply(lambda x: x.dot(X))
形状(1,)和(2,1)未对齐:1(dim 0)!= 2(dim 0)
等待!什么?!
因此,我创建了一个自定义函数来查看滚动的过程。
def print_type_sum(x):
print type(x), x.shape
return x.sum()
然后运行:
print df.rolling(1).apply(print_type_sum)
<type 'numpy.ndarray'> (1L,)
<type 'numpy.ndarray'> (1L,)
<type 'numpy.ndarray'> (1L,)
<type 'numpy.ndarray'> (1L,)
<type 'numpy.ndarray'> (1L,)
<type 'numpy.ndarray'> (1L,)
<type 'numpy.ndarray'> (1L,)
<type 'numpy.ndarray'> (1L,)
<type 'numpy.ndarray'> (1L,)
<type 'numpy.ndarray'> (1L,)
A B
0 0.44 0.41
1 0.46 0.47
2 0.46 0.02
3 0.85 0.82
4 0.78 0.76
我的结果pd.DataFrame
是一样的,那很好。但是它打印了10个一维ndarray
对象。关于什么rolling(2)
print df.rolling(2).apply(print_type_sum)
<type 'numpy.ndarray'> (2L,)
<type 'numpy.ndarray'> (2L,)
<type 'numpy.ndarray'> (2L,)
<type 'numpy.ndarray'> (2L,)
<type 'numpy.ndarray'> (2L,)
<type 'numpy.ndarray'> (2L,)
<type 'numpy.ndarray'> (2L,)
<type 'numpy.ndarray'> (2L,)
A B
0 NaN NaN
1 0.90 0.88
2 0.92 0.49
3 1.31 0.84
4 1.63 1.58
同样的东西,期望输出,但是它打印了8个ndarray
对象。
我为每列rolling
生成一维ndarray
长度的长度window
,与我预期ndarray
的形状相对(window, len(df.columns))
。
我现在没有办法轻松进行滚动的多因素回归。
使用strides views concept ondataframe
,这是向量化方法-
get_sliding_window(df, 2).dot(X) # window size = 2
运行时测试-
In [101]: df = pd.DataFrame(np.random.rand(5, 2).round(2), columns=['A', 'B'])
In [102]: X = np.array([2, 3])
In [103]: rolled_df = roll(df, 2)
In [104]: %timeit rolled_df.apply(lambda df: pd.Series(df.values.dot(X)))
100 loops, best of 3: 5.51 ms per loop
In [105]: %timeit get_sliding_window(df, 2).dot(X)
10000 loops, best of 3: 43.7 µs per loop
验证结果-
In [106]: rolled_df.apply(lambda df: pd.Series(df.values.dot(X)))
Out[106]:
0 1
1 2.70 4.09
2 4.09 2.52
3 2.52 1.78
4 1.78 3.50
In [107]: get_sliding_window(df, 2).dot(X)
Out[107]:
array([[ 2.7 , 4.09],
[ 4.09, 2.52],
[ 2.52, 1.78],
[ 1.78, 3.5 ]])
在那里有巨大的进步,我希望在大型阵列上能保持明显的进步!
问题内容: 我最终在写出这个问题的时候就弄清楚了,所以无论如何我都会发布并回答我自己的问题,以防别人需要一点帮助。 问题 假设我们有一个,包含该数据。 目标 对于每一行,将 其一个月*以内的每一行的总和相加,最好使用一种非常干净的语法。 * 我尝试过的 但这引发了异常 版: 问题答案: 使用偏移量而不是专门使用30天或大约一个月。 最初,我凭直觉跳了起来,使用了一个月,但现在很清楚为什么不起作用。
我需要得到df的滚动第二大值。 以获得最大的价值 当我尝试这个时,python抛出了一个错误 这是虫子吗?我还能用什么性能好的?
我有一个这样的数据帧: 我试图了解如何应用自定义滚动函数。我尝试过这样做: 但这给了我原来的DataFrame回来: 如果我有一个不同的数据帧,如下所示: 同样的滚动应用似乎工作: 为什么这对第一个数据帧不起作用? 熊猫版本:0.20。2. Python版本:2.7.10 使现代化 所以,我意识到的列是对象类型的,而lambda函数的输出是整数。的列都是整数列。我假设这就是应用程序不起作用的原因。
问题内容: 我有数据集: 详细原始数据-> http://pastebin.com/beiEeS80 ,我放入其中,这是我完整的代码: 但这是返回错误 如何解决呢? 问题答案: 我在Jupyter中运行了此文件,并将exampledata.txt放置在与笔记本相同的目录中。 请注意第一行: 未在数据文件中定义时加载列。我删除了此列名。 解 说明 您看到的问题是pd.qcut的结果,假设5个bin大
因此.loc和.iloc不是典型的函数。它们以某种方式使用[和]来包围参数,使其与普通数组索引相当。然而,我从未在另一个库中看到过这种情况(我可以想到,可能numpy就是这样的东西,我不知道它在技术上是如何工作的/在python代码中是如何定义的)。 本例中的括号是否只是函数调用的语法糖?如果是这样,那么如何让任意函数使用括号而不是括号呢?否则,它们的使用/定义有什么特殊之处?
我只是不明白第二行“==”的意思: -这不是一个测试,没有if语句… -它不是一个变量声明。。。 我以前从未见过这个,事情是是熊猫系列,而不是测试...