我有5个货币对的1033每日返回点,我想在其上运行滚动窗口回归,但rollapply不适用于我定义的使用lm()的函数.这是我的数据:
> head(fxr)
USDZAR USDEUR USDGBP USDCHF USDCAD
2007-10-18 -0.005028709 -0.0064079963 -0.003878743 -0.0099537170 -0.0006153215
2007-10-19 -0.001544470 0.0014275520 -0.001842564 0.0023058211 -0.0111410271
2007-10-22 0.010878027 0.0086642116 0.010599365 0.0051899551 0.0173792230
2007-10-23 -0.022783987 -0.0075236355 -0.010804304 -0.0041668499 -0.0144788687
2007-10-24 -0.006561223 0.0008545792 0.001024275 -0.0004261666 0.0049525483
2007-10-25 -0.014788901 -0.0048523001 -0.001434280 -0.0050425302 -0.0046422944
> tail(fxr)
USDZAR USDEUR USDGBP USDCHF USDCAD
2012-02-10 0.018619309 0.007548205 0.005526184 0.006348533 0.0067151342
2012-02-13 -0.006449463 -0.001055966 -0.002206810 -0.001638002 -0.0016995755
2012-02-14 0.006320364 0.006843933 0.006605875 0.005992935 0.0007001751
2012-02-15 -0.001666872 0.004319096 -0.001568874 0.003686840 -0.0015009759
2012-02-16 0.006419616 -0.003401364 -0.005194817 -0.002709588 …Run Code Online (Sandbox Code Playgroud) Pandas似乎缺少一个R风格的矩阵级滚动窗口函数(rollapply(..., by.column = FALSE)),只提供基于矢量的版本.因此,我尝试遵循这个问题,并且它可以复制的示例很好地工作,但DataFrame即使使用(看似相同的)底层Numpy数组,它也无法与pandas一起使用.
人工问题复制:
import numpy as np
import pandas as pd
from numpy.lib.stride_tricks import as_strided
test = [[x * y for x in range(1, 10)] for y in [10**z for z in range(5)]]
mm = np.array(test, dtype = np.int64)
pp = pd.DataFrame(test).values
Run Code Online (Sandbox Code Playgroud)
mm和pp外观是相同的:

numpy直接派生矩阵给了我我想要的完美:
as_strided(mm, (mm.shape[0] - 3 + 1, 3, mm.shape[1]), (mm.shape[1] * 8, mm.shape[1] * 8, 8))
Run Code Online (Sandbox Code Playgroud)
也就是说,它在3d矩阵中给出了3个步幅,每个3行,允许我对一次向下移动一行的子矩阵执行计算.

但是熊猫派生的版本(相同的调用mm替换为pp):
as_strided(pp, (pp.shape[0] - 3 …Run Code Online (Sandbox Code Playgroud) 假设我有一个长度为30的数组,其中包含4个错误值.我想为那些不好的值创建一个掩码,但由于我将使用滚动窗口函数,我还希望在每个坏值被标记为坏之后有一定数量的后续索引.在下面,n = 3:
我想尽可能高效地执行此操作,因为此例程将在包含数十亿个数据点的大型数据系列上运行多次.因此,我需要尽可能接近numpy矢量化解决方案,因为我想避免python循环.
为了避免重新输入,这里是数组:
import numpy as np
a = np.array([4, 0, 8, 5, 10, 9, np.nan, 1, 4, 9, 9, np.nan, np.nan, 9,\
9, 8, 0, 3, 7, 9, 2, 6, 7, 2, 9, 4, 1, 1, np.nan, 10])
Run Code Online (Sandbox Code Playgroud) 假设我有一个单词列表,其中一个关键字,在这种情况下是"停止",划分完整的句子:
["Hello", "from", "Paris", "stop", "Weather", "is", "sunny", "stop", "Missing", "you", "stop"]
Run Code Online (Sandbox Code Playgroud)
我想变成:
[["Hello", "from", "Paris"], ["Weather", "is", "sunny"], ["Missing", "you"]]
Run Code Online (Sandbox Code Playgroud)
我知道我可以用String.split的字符串做到这一点,但理想情况下我想学习如何用基本的功能结构解决上述问题,比如[head | tail]等的递归,但我无法弄清楚在哪里去开始如何累积中间列表.
我有一个奇怪的情况与scipy.stats.linregress似乎返回一个不正确的标准错误:
from scipy import stats
x = [5.05, 6.75, 3.21, 2.66]
y = [1.65, 26.5, -5.93, 7.96]
gradient, intercept, r_value, p_value, std_err = stats.linregress(x,y)
>>> gradient
5.3935773611970186
>>> intercept
-16.281127993087829
>>> r_value
0.72443514211849758
>>> r_value**2
0.52480627513624778
>>> std_err
3.6290901222878866
Run Code Online (Sandbox Code Playgroud)
Excel返回以下内容:
slope: 5.394
intercept: -16.281
rsq: 0.525
steyX: 11.696
Run Code Online (Sandbox Code Playgroud)
steyX是excel的标准误差函数,返回11.696而不是scipy的3.63.谁知道这里发生了什么?在python中获得回归的标准错误的任何替代方法,而不是去Rpy?
我正在学习Elixir并且有点困惑为什么我们必须使用相同函数的多个定义进行分支,而不是使用case语句.以下是来自Elixir in Action的第一版第81页的示例,用于计算文件中的行:
defmodule LinesCounter do
def count(path) do
File.read(path)
|> lines_num
end
defp lines_num({:ok, contents}) do
contents
|> String.split("\n")
|> length
end
defp lines_num({:error, _}), do: "error"
end
Run Code Online (Sandbox Code Playgroud)
所以我们有两个defp lines_num实例来处理以下情况:ok和:error.但是,以下是不是做同样的事情,可以说是更清洁,更简洁,只使用一个函数而不是三个?
defmodule LinesCounterCase do
def count(file) do
case File.read(file) do
{:ok, contents} -> contents |> String.split("\n") |> length
{:error, _} -> "error"
end
end
end
Run Code Online (Sandbox Code Playgroud)
两者的工作方式相同.
我不想学习不正确的习语,因为我开始了Elixir的旅程,所以澄清以这种方式使用case语句的缺点,就是我在寻找的东西.
您好我有1000个数据系列,每个系列有1500个点.
它们形成一个(1000x1500)大小的Numpy数组,使用np.zeros((1500,1000))创建,然后填充数据.
现在如果我希望阵列增长到1600 x 1100呢?我是否必须使用hstack和vstack添加数组,还是有更好的方法?
我希望不要更改数组中1000x1500片段中的数据,基本上只添加空白数据(零)添加到底部和右侧.
谢谢.
从下面的数据框中可以看出,RBloomberg返回了周末日期的NA.
如果是周末,我想删除整行.我该怎么做?
我不想使用na.omit,因为这可能会删除工作日行,如果/当我在数据中获得NA时出于正当理由.
ticker date yld_ytm_mid
1 R206 2011-05-11 6.946
2 R206 2011-05-12 6.969
3 R206 2011-05-13 7.071
4 R206 2011-05-14 NA
5 R206 2011-05-15 NA
6 R201 2011-05-11 7.201
7 R201 2011-05-12 7.213
8 R201 2011-05-13 7.323
9 R201 2011-05-14 NA
10 R201 2011-05-15 NA
11 R157 2011-05-11 7.611
12 R157 2011-05-12 7.622
13 R157 2011-05-13 7.718
14 R157 2011-05-14 NA
15 R157 2011-05-15 NA
16 R203 2011-05-11 8.165
17 R203 2011-05-12 8.170
18 R203 2011-05-13 8.279
19 R203 …Run Code Online (Sandbox Code Playgroud) 好吧所以这里是一个微妙的"怪癖"在r as.Date函数转换为带有时区的POSIXct,我想知道它是否是一个bug.
> as.POSIXct("2013-03-29", tz = "Europe/London")
[1] "2013-03-29 GMT"
> as.Date(as.POSIXct("2013-03-29", tz = "Europe/London"))
[1] "2013-03-29"
Run Code Online (Sandbox Code Playgroud)
到目前为止没有问题,但.....
> as.POSIXct("2013-04-01", tz = "Europe/London")
[1] "2013-04-01 BST"
> as.Date(as.POSIXct("2013-04-01", tz = "Europe/London"))
[1] "2013-03-31"
Run Code Online (Sandbox Code Playgroud)
有谁见过这个?这是一个错误还是另一个怪癖?愚人节?
> x <- data.frame(a = rnorm(10), b = rnorm(10), c = rnorm(10))
> x
a b c
1 -1.09651022 -0.7416278 0.209405373
2 1.53644398 -0.9463432 0.374955227
3 1.71132675 -0.3828052 2.024143398
4 -1.10622882 -0.3599187 -0.808780103
5 -0.49616562 0.7061180 0.644142118
6 -1.75452442 0.3890812 -0.623815889
7 0.06315648 0.5103820 -1.501873998
8 0.64856129 -1.0973679 1.432024595
9 -0.62828873 -0.3159317 0.183674189
10 -0.82657934 1.6376569 -0.003601196
> rownames(x) <- as.Date(Sys.Date() - 9:0)
> x
a b c
2013-06-07 -1.09651022 -0.7416278 0.209405373
2013-06-08 1.53644398 -0.9463432 0.374955227
2013-06-09 1.71132675 -0.3828052 2.024143398 …Run Code Online (Sandbox Code Playgroud)