译者:赵西西
原博客简介:Predictive Hacks是与数据科学相关的在线资源中心。该博客是由一群数据科学家运营,专注于讲解在各种领域如何运用大数据技术(从机器学习和人工智能到业务领域)。
这一系列对数据科学世界中常见的任务提供了一些代码作为参考。本文主要涵盖 Python、R、Unix、Excel、Git和Docker等语言的提示(Tips)。这一期主要展示在不同应用场景下的10个提示。
dplyr
包允许我们在多个列上连接两个数据框。只需在by中添加列,这些列称之为“键”,比如by = c("x1" = "x2", "y1" = "y2") ,结果如下所示:
library(dplyr)
set.seed(5)
df1 <- tibble(
x1 = letters[1:10],
y1 = LETTERS[11:20],
a = rnorm(10)
)
df2 <- tibble(
x2 = letters[1:10],
y2 = LETTERS[11:20],
b = rnorm(10)
)
df<-df1%>%inner_join(df2, df2, by = c("x1" = "x2", "y1" = "y2"))
df
# A tibble: 10 x 4
x1 y1 a b
<chr> <chr> <dbl> <dbl>
1 a K -0.841 1.23
2 b L 1.38 -0.802
3 c M -1.26 -1.08
4 d N 0.0701 -0.158
5 e O 1.71 -1.07
6 f P -0.603 -0.139
7 g Q -0.472 -0.597
8 h R -0.635 -2.18
9 i S -0.286 0.241
10 j T 0.138 -0.259
假设我们想对鸢尾花数据集中的每个物种分别构建不同的回归模型,可以使用以下两种不同的方法:
my_models<-list()
for (s in unique(iris$Species)) {
tmp<-iris[iris$Species==s,]
my_models[[s]]<-lm(Sepal.Length~Sepal.Width+Petal.Length+Petal.Width, data=tmp)
}
Call:
lm(formula = Sepal.Length ~ Sepal.Width + Petal.Length + Petal.Width,
data = tmp)
Coefficients:
(Intercept) Sepal.Width Petal.Length Petal.Width
2.3519 0.6548 0.2376 0.2521
assign
按名字存储模型for (s in unique(iris$Species)) {
tmp<-iris[iris$Species==s,]
assign(s,lm(Sepal.Length~Sepal.Width+Petal.Length+Petal.Width, data=tmp))
}
# get the 'setosa' model
get("setosa")
Call:
lm(formula = Sepal.Length ~ Sepal.Width + Petal.Length + Petal.Width,
data = tmp)
Coefficients:
(Intercept) Sepal.Width Petal.Length Petal.Width
2.3519 0.6548 0.2376 0.2521
假设我们想在R中运行sapply或lapply,并且输入参数有多个。此时,可以定义一个形参,对形参应用sapply,并将固定的值赋给其余参数:
# this is the function like a linear equation
# of the form y= a + b * x
my_func<- function(a,b,c) {
a+b*c
}
# the values of the x
x = c(1,5,10)
# we set a=1 and b=2
sapply(x,my_func,a=1, b=2)
[1] 3 11 21
假设数据框如下:
set.seed(5)
df<-as.data.frame(matrix(sample(1:100,12),ncol=3))
df
V1 V2 V3
1 66 41 19
2 57 85 3
3 79 94 38
4 75 71 58
我们可以按行获取每一行的最大值对应的列名,如下所示:
colnames(df)[max.col(df,ties.method="random")]
[1] "V1" "V2" "V2" "V1"
可以使用均匀分布从特定范围的Unix时间戳生成随机日期。例如,生成10个随机日期:
library(lubridate)
lubridate::as_datetime( runif(10, 1546290000, 1577739600))
[1] "2019-12-09 15:45:26 UTC" "2019-08-31 19:28:03 UTC" "2019-01-13 12:15:13 UTC" "2019-11-15 00:13:25 UTC"
[5] "2019-01-19 06:31:10 UTC" "2019-11-02 12:46:34 UTC" "2019-09-04 19:16:31 UTC" "2019-07-29 11:53:43 UTC"
[9] "2019-01-25 23:08:20 UTC" "2019-02-03 02:30:21 UTC"
假设有以下列表:
l = [(1,2), (4,6), (5,1), (1,0)]
我想按元组的第二个元素来排序:
sorted(l, key=lambda t: t[1])
[(1, 0), (5, 1), (1, 2), (4, 6)]
假设有一个列表:
l = [[1, 2, 3], [4, 5, 6], [7], [8, 9]]
我们希望将其扁平化为一个列表。这时,可以利用for循环实现,如下所示:
[item for sublist in l for item in sublist]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
elif
处理列表问题场景:对一个产品进行打分,分数等级为1~5,并将其分为三类,类别如下:
x = [1,2,3,4,5,4,3,2,1]
["Good" if i>=4 else "Neutral" if i==3 else "Bad" for i in x]
['Bad', 'Bad', 'Neutral', 'Good', 'Good', 'Good', 'Neutral', 'Bad', 'Bad']
在许多.py文件中,脚本顶部可能出现shebang行。它的作用是设置解释器的位置。通过在脚本顶部添加#!/usr/bin/python3,即可在Unix系统上运行文件.py,并且系统会自动将其识别为一个Python脚本。或者,也可以将脚本作为python3 file.py运行。例如,假设文件.py是:
#!/usr/bin/python3
print("Hello shebang line")
我们也可以在Unix上运行:
$ ./file.py