这是我发现的:
import pandas as pdimport numpy as npnp.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",dfprint "\nX = \n",Xprint "\ndf.shape =",df.shape,",X.shape =",X.shapedf = A B0 0.44 0.411 0.46 0.472 0.46 0.023 0.85 0.824 0.78 0.76X = [[ 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.74951 0.81792 0.44443 1.47114 1.3562dtype: float64
Groupby – >应用表现如我所料:
df.groupby(level=0).apply(lambda x: x.values.dot(X)[0,0])0 0.74951 0.81792 0.44443 1.47114 1.3562dtype: float64
但是当我跑步时:
df.rolling(1).apply(lambda x: x.values.dot(X))
我明白了:
AttributeError: ‘numpy.ndarray’ object has no attribute ‘values’
好的,所以pandas在其滚动实现中使用了直接的ndarray.我能解决这个问题.不要使用.values来获取ndarray,让我们尝试:
df.rolling(1).apply(lambda x: x.dot(X))
shapes (1,) and (2,1) not aligned: 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,) A B0 0.44 0.411 0.46 0.472 0.46 0.023 0.85 0.824 0.78 0.76
我生成的pd.DataFrame是一样的,这很好.但它打印出10个单维ndarray对象.滚动怎么样(2)
print df.rolling(2).apply(print_type_sum)<type 'numpy.ndarray'> (2L,)<type 'numpy.ndarray'> (2L,) A B0 NaN NaN1 0.90 0.882 0.92 0.493 1.31 0.844 1.63 1.58
同样的事情,期待输出,但它打印了8个ndarray对象.滚动为每列产生一个长度窗口的单维ndarray,而不是我预期的形状ndarray(window,len(df.columns)).
问题是为什么?
我现在没有办法轻松运行滚动多因素回归.
解决方法 使用strides views concept on dataframe
,这是一个矢量化的方法 – get_slIDing_window(df,2).dot(X) # window size = 2
运行时测试 –
In [101]: df = pd.DataFrame(np.random.rand(5,'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 loopIn [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 11 2.70 4.092 4.09 2.523 2.52 1.784 1.78 3.50In [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 ]])
那里有巨大的改进,我希望在更大的阵列上保持显着!
总结以上是内存溢出为你收集整理的python – 为什么pandas滚动使用单维ndarray全部内容,希望文章能够帮你解决python – 为什么pandas滚动使用单维ndarray所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)