小编vis*_*tor的帖子

如何将pandas列的值除以另一列

我有一个数据帧:

>>> dt
                   COL000   COL001   QT
STK_ID  RPT_Date                       
STK000  20120331   2.6151   2.1467    1
        20120630   4.0589   2.3442    2
        20120930   4.4547   3.9204    3
        20121231   4.1360   3.8559    4
STK001  20120331  -0.2178   0.9184    1
        20120630  -1.9639   0.7900    2
        20120930  -2.9147   1.0189    3
        20121231  -2.5648   2.3743    4
STK002  20120331  -0.6426   0.9543    1
        20120630  -0.3575   1.6085    2
        20120930  -2.3549   0.7174    3
        20121231  -3.4860   1.6324    4
Run Code Online (Sandbox Code Playgroud)

我希望列值除以'QT'列,有点像这样:

dt =  dt/dt.QT     # pandas does not accept this syntax
Run Code Online (Sandbox Code Playgroud)

所需的输出是:

STK_ID  RPT_Date        COL000       COL001  QT
STK000  20120331   2.615110188  2.146655745 …
Run Code Online (Sandbox Code Playgroud)

division pandas

21
推荐指数
1
解决办法
4万
查看次数

SciPy:leastsq vs least_squares

SciPy为非线性最小二乘问题提供了两个函数:

optimize.leastsq() 仅使用Levenberg-Marquardt算法.

optimize.least_squares() 允许我们选择Levenberg-Marquardt,Trust Region Reflective或Trust Region Dogleg算法.

我们应该总是用least_squares()而不是leastsq()吗?

如果是这样,后者的目的是什么?

scipy least-squares levenberg-marquardt

16
推荐指数
1
解决办法
2980
查看次数

NumPy矢量化与集成

我有一个矢量 在此输入图像描述 并希望制作另一个长度相同的矢量,其第k个分量是

在此输入图像描述

问题是:我们如何才能将其矢量化以提高速度?NumPy vectorize()实际上是for循环,所以它不计算.

Veedrac指出" 没有办法将纯Python函数应用于NumPy数组的每个元素而不会多次调用它 ".由于我使用的是NumPy函数而不是"纯Python"函数,我认为它可以进行矢量化,但我不知道如何.

import numpy as np
from scipy.integrate import quad
ws = 2 * np.random.random(10) - 1
n  = len(ws)
integrals = np.empty(n)

def f(x, w):
    if w < 0: return np.abs(x * w)
    else:     return np.exp(x) * w

def temp(x): return np.array([f(x, w) for w in ws]).sum()

def integrand(x, w): return f(x, w) * np.log(temp(x))

## Python for loop
for k in range(n):
    integrals[k] = quad(integrand, -1, 1, args = ws[k])[0]

## NumPy vectorize …
Run Code Online (Sandbox Code Playgroud)

numpy vectorization quad

5
推荐指数
1
解决办法
2244
查看次数

计算自上一个头以来的尾部数量

考虑一系列硬币投掷:1,0,0,1,0,1,其中tail = 0且head = 1.

所需的输出是序列:0,1,2,0,1,0

输出序列的每个元素都计算自上一个头以来的尾部数.

我尝试过一种天真的方法:

def timer(seq):
    if seq[0] == 1: time = [0]
    if seq[0] == 0: time = [1]
    for x in seq[1:]:
        if x == 0: time.append(time[-1] + 1)
        if x == 1: time.append(0)
    return time
Run Code Online (Sandbox Code Playgroud)

问题:有更好的方法吗?

python algorithm sequence

5
推荐指数
1
解决办法
207
查看次数

检查中断条件是否被触发

Python 中是否有一种优雅的方法来检测最后一次迭代是否涉及中断条件或根本没有?

C++ 示例:

int k, n = 10;
for (k = 0; k < n; k++)
    if (condition) break;

if (k == n) cout << "Never broke\n";
else        cout << "Broke at " << k << '\n';
Run Code Online (Sandbox Code Playgroud)

Python 示例:

n = 10
for k in range(n):
    if condition: break

if k == n: print("Never broke")
else:      print("Broke at", k)
Run Code Online (Sandbox Code Playgroud)

在Python中,我们不知道condition最后一次迭代是否为真,因为在这两种情况下k都是9。

为什么不直接使用range(n + 1)呢?因为在某些情况下,当 k 为 n 时,我们可能会收到“索引超出范围”错误。

一种可能的解决方法是使用如下所示的哨兵值,但有更好的方法吗?

n, flag = 10, True …
Run Code Online (Sandbox Code Playgroud)

python loops break sentinel

4
推荐指数
1
解决办法
950
查看次数

NumPy vectorize()或dot()出现错误

在下面的代码中,y1和y2应该相等,但它们不是.vectorize()或dot()中可能有错误吗?

import numpy as np
interval = np.arange(0, 30, 0.1)
y1 = [- 1.57 * max(0, x - 10) - 0.72 * max(0, 15 - x)
      - 1.09 * max(0, 20 - x) for x in interval]

def fun(x, pivot, truth):
    if truth: return max(0, x - pivot)
    else:     return max(0, pivot - x)

pivots = [10, 15, 20]
truths = [ 1,  0,  0]
coeffs = [-1.57, -0.72, -1.09]
y2 = [np.dot(np.vectorize(fun)(x, pivots, truths), coeffs) for x in interval] …
Run Code Online (Sandbox Code Playgroud)

types numpy vectorization

2
推荐指数
1
解决办法
153
查看次数

具有glmnet和lm的普通最小二乘法

stackoverflow.com/q/38378118中询问了此问题,但没有令人满意的答案。

LASSO与?= 0等效于普通的最小二乘,但是R glmnet()lm()R中似乎不是这种情况。为什么?

library(glmnet)
options(scipen = 999)

X = model.matrix(mpg ~ 0 + ., data = mtcars)
y = as.matrix(mtcars["mpg"])
coef(glmnet(X, y, lambda = 0))
lm(y ~ X)
Run Code Online (Sandbox Code Playgroud)

它们的回归系数最多相符2个有效数字,这可能是由于其优化算法的终止条件略有不同:

                  glmnet        lm
(Intercept)  12.19850081  12.30337
cyl          -0.09882217  -0.11144
disp          0.01307841   0.01334
hp           -0.02142912  -0.02148
drat          0.79812453   0.78711
wt           -3.68926778  -3.71530
qsec          0.81769993   0.82104
vs            0.32109677   0.31776
am            2.51824708   2.52023
gear          0.66755681   0.65541
carb         -0.21040602  -0.19942
Run Code Online (Sandbox Code Playgroud)

当添加交互项时,差异会更糟。

X = model.matrix(mpg ~ 0 + . + . …
Run Code Online (Sandbox Code Playgroud)

r least-squares lm glmnet

2
推荐指数
1
解决办法
1213
查看次数

前向声明类时成员函数的行为

当使用C++ 11编译以下代码时,它的行为与预期的一样.

class Student;

class University
{
    vector <Student*> students;
public:
    University();
    void print();
};

class Student
{
    string name;
public:
    Student(string nom) : name(nom) {}
    friend ostream& operator << (ostream& out, Student* S)
    {
        return out << S -> name;
    }
};

University::University()
{
    for (string name: {"Alice", "Bob"})
        students.push_back(new Student(name));
}

void University::print() { for (auto s: students) cout << s << '\n'; }

int main()
{
    University uni;
    uni.print();
}
Run Code Online (Sandbox Code Playgroud)

打印输出是

Alice
Bob
Run Code Online (Sandbox Code Playgroud)

但是,当print()函数在其类声明中实现时,如下所示:

class University
{ …
Run Code Online (Sandbox Code Playgroud)

c++ class forward-declaration c++11

1
推荐指数
1
解决办法
84
查看次数