我有一个数据帧:
>>> 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) SciPy为非线性最小二乘问题提供了两个函数:
optimize.leastsq() 仅使用Levenberg-Marquardt算法.
optimize.least_squares() 允许我们选择Levenberg-Marquardt,Trust Region Reflective或Trust Region Dogleg算法.
我们应该总是用least_squares()而不是leastsq()吗?
如果是这样,后者的目的是什么?
我有一个矢量
并希望制作另一个长度相同的矢量,其第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) 考虑一系列硬币投掷: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 中是否有一种优雅的方法来检测最后一次迭代是否涉及中断条件或根本没有?
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) 在下面的代码中,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) 在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) 当使用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)