我有一个成对距离的 pandas 数据框,其形式为:
SampleA SampleB Num_Differences
0 sample_1 sample_2 1
1 sample_1 sample_3 4
2 sample_2 sample_3 8
Run Code Online (Sandbox Code Playgroud)
请注意,没有自我比较(例如,不会表示sample_1 与sample_1)。我想将此表转换为方形距离矩阵,如下所示:
sample_1 sample_2 sample_3
sample_1 1 4
sample_2 1 8
sample_3 4 8
Run Code Online (Sandbox Code Playgroud)
任何人都可以给我一些关于如何在 python 中进行此类转换的指示吗?该问题类似于 R 中的上一个问题(将成对距离转换为 R 中的距离矩阵),但我不知道要使用相应的 python 函数。这个问题似乎也与这个问题相反(Convert a distance matrix to a list ofpairwise distances in Python)。
以我正在使用的形式重现数据框的一些代码:
SampleA SampleB Num_Differences
0 sample_1 sample_2 1
1 sample_1 sample_3 4
2 sample_2 sample_3 8
Run Code Online (Sandbox Code Playgroud) 我正在使用原始目的地(OD)数据,该数据在单独的列中包含一个原始ID和一个目标ID。有时,重要的是汇总相同的OD对,但要交换起点和终点。
OD数据如下所示:
orign dest value
E02002361 E02002361 109
E02002361 E02002363 38
E02002361 E02002367 10
E02002361 E02002371 44
E02002363 E02002361 34
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,第一行和最后一行可以被视为同一对,但方向相反。面临的挑战是如何有效地识别它们是否重复。
我创建了一个包stplanr,它可以回答这个问题,如下面的可重现示例所示:
x = read.csv(stringsAsFactors = FALSE, text = "orign,dest,value
E02002361,E02002361,109
E02002361,E02002363,38
E02002361,E02002367,10
E02002361,E02002371,44
E02002363,E02002361,34")
duplicated(stplanr::od_id_order(x)[[3]])
#> Registered S3 method overwritten by 'R.oo':
#> method from
#> throw.default R.methodsS3
#> [1] FALSE FALSE FALSE FALSE TRUE
Run Code Online (Sandbox Code Playgroud)
由reprex软件包(v0.3.0)创建于2019-07-27
这种方法的问题在于,对于大型数据集,它的速度很慢。
我已经研究了从矩阵的每一列中获取最小值的最快方法?这表明这pmin是跨多个列(而不是2个)获取最小值的最有效方法,而我们已经在使用它。
与删除重复组合(不考虑顺序)不同,此问题是关于仅两列的重复标识和效率。删除重复组合中发布的解决方案(与顺序无关)似乎比以下时间所示的最慢解决方案要慢。
比szudzik_pairing我的同事马尔科姆·摩根(Malcolm Morgan)创建的功能更快的解决方案是基于Matthew Szudzik开发的方法 …
我正在使用这样的数据框,其中的ID列指示特定的出版物:
ID AuthorA AuthorB AuthorC
1 Chris Lee Jill
2 Jill Tom Lee
3 Tom Chris Lee
4 Lee Jill NA
5 Jill Chris NA
Run Code Online (Sandbox Code Playgroud)
我想为社交网络分析生成source、target、 和专栏。count换句话说,计算两位作者出现在同一出版物上的次数。然而,我正在使用的数据框有 18 个作者列。这应该是最终输出:
Source Target Count
Chris Lee 2
Chris Jill 2
Lee Jill 3
Jill Tom 1
Tom Lee 2
Tom Chris 1
Run Code Online (Sandbox Code Playgroud) 鉴于目标('b', 'a')和投入:
x0 = ('b', 'a', 'z', 'z')
x1 = ('b', 'a', 'z', 'z')
x2 = ('z', 'z', 'a', 'a')
x3 = ('z', 'b', 'a', 'a')
Run Code Online (Sandbox Code Playgroud)
目的是找到连续('b', 'a')元素的位置并获得输出:
>>> find_ba(x0)
0
>>> find_ba(x1)
0
>>> find_ba(x2)
None
>>> find_ba(x3)
1
Run Code Online (Sandbox Code Playgroud)
使用pairwise食谱:
from itertools import tee
def pairwise(iterable):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
a, b = tee(iterable)
next(b, None)
return zip(a, b)
Run Code Online (Sandbox Code Playgroud)
我可以这样做以获得所需的输出:
def find_ba(x, target=('b', 'a')):
try:
return next(i for i, pair …Run Code Online (Sandbox Code Playgroud) 是否有一种简短/惯用的方法来迭代集合中的每对元素?
更好的是迭代集合的所有固定基数子集的方法。
经典而丑陋的方法是:
val s = setOf(1, 2, 3, 4)
for (i in s) {
for (j in s) {
if (i != j) {
println("$i $j")
}
}
}
Run Code Online (Sandbox Code Playgroud)
为了拥有更大的子集,需要更多的循环,因此这是不可扩展的。
我有一个data.table给我在不同的公交路线()的位置(origin和destination)之间的连接route_id.
library(data.table)
library(magrittr)
# data for reproducible example
dt <- data.table( origin = c('A','B','C', 'F', 'G', 'H'),
destination = c('B','C','D', 'G', 'H', 'I'),
freq = c(2,2,2,10,10,10),
route_id = c(1,1,1,2,2,2), stringsAsFactors=FALSE )
# > dt
# origin destination freq route_id
# 1: A B 2 1
# 2: B C 2 1
# 3: C D 2 1
# 4: F G 10 2
# 5: G H 10 2
# 6: H …Run Code Online (Sandbox Code Playgroud) xarray我正在尝试遵循文档上的教程: http://xarray.pydata.org/en/stable/dask.html#automatic-parallelization
我的最终目标是从具有约 100,000 个属性的数据集中获取成对的斯皮尔曼相关矩阵,这使我找到了上面提到的教程。我正在测试iris datasetfrom的实现sklearn,但我遇到了问题,因为这种类型的并行化语法与joblib.
我不知道如何获取下面的代码来制作成对的斯皮尔曼相关矩阵,其结果形状为(150,150)。我展示了一个执行此操作的示例,pandas但这不是并行的,并且在我的实际数据集上将花费很长时间。
有谁知道如何调整此xarray代码以创建对称相关性度量?如果没有,有人可以指导我一种更好的方法来进行成对相似性测量。我知道,sklearns pairwise_distance但我想知道这是否是唯一的实现?
import bottleneck
import pandas as pd
import xarray as xr
from sklearn.datasets import load_iris
X_iris = pd.DataFrame(load_iris().data,
index = ["iris_%d" % i for i in range(load_iris().data.shape[0])],
columns = [x.split(" (cm)")[0].replace(" ","_") for x in load_iris().feature_names])
da_iris = xr.DataArray(X_iris, dims=["samples", "attributes"])
def covariance_gufunc(x, y):
return ((x - x.mean(axis=-1, keepdims=True))
* (y - y.mean(axis=-1, keepdims=True))).mean(axis=-1)
def pearson_correlation_gufunc(x, y): …Run Code Online (Sandbox Code Playgroud) 我需要在 SQL Server 中找到匹配的记录对,但每条记录只能包含在1 pair 中。一旦记录与一对匹配,就应该将其从任何未来对的考虑中删除。
我已经尝试过涉及ROW_NUMBER()and 的解决方案LEAD(),但我无法完全到达那里。
这将用于根据信用评分、收入等多个客户属性,将金融账户与类似账户配对进行审查。
陈述:
declare @test table (ID numeric, Color varchar(20))
insert into @test values
(1,'Blue'),(2,'Red'),(3,'Blue'),(4,'Yellow'),(5,'Blue'),(6,'Red')
select*
from @test t1
join @test t2
on t1.Color = t2.Color
and t1.ID < t2.ID -----removes reverse-pairs and self-pairs
Run Code Online (Sandbox Code Playgroud)
当前结果:
ID Color ID Color
--- ------- --- --------
1 Blue 3 Blue
1 Blue 5 Blue -----should not appear because 1 has already been paired
3 Blue 5 Blue -----should not appear …Run Code Online (Sandbox Code Playgroud) 我正在努力创建一系列高质量的 ggboxplots,如下所示:
对于上面的示例,事后比较的统计数据已通过您可以在此链接页面找到的方式获得,并且我运行了以下代码
#Compute the post-hocs
postHocs <- df %>%
tidyr::pivot_longer(., -c(A, C, D),'s')%>%
mutate(s = fct_relevel(s,
c("E", "F", "G",
"H", "I", "J",
"K", "L", "M",
"N", "O", "P")) %>%
arrange(s) %>%
group_by(s) %>%
pairwise_t_test(
value ~ D, paired = TRUE,
p.adjust.method = "bonferroni"
) %>%
#dplyr::select(., -'s')%>%
print()
Run Code Online (Sandbox Code Playgroud)
同时得到方差分析统计:
res.aov <- df %>%
tidyr::pivot_longer(., -c(A, C, D),'s')%>%
mutate(s = fct_relevel(s,c("E", "F", "G",
"H", "I", "J",
"K", "L", "M",
"N", "O", "P")
)))%>%
arrange(s) …Run Code Online (Sandbox Code Playgroud) 我想在R中的Levene的测试中进行成对比较事后测试。我知道如何使用PROC GLM在SAS中进行测试,但是我似乎不知道如何在R中进行测试。有人吗?理念?在下面的示例中,我希望能够测试“ cat”的所有级别(即AB,AC,AD,BC,BD,CD)之间的方差均匀性。我发现最好的方法是将我的数据子集到每个对中,然后对每个子集运行一次Levene检验,然后在最后进行Bonferroni校正。但是,当我的因素数量很大时,这不是实际的解决方案。
library(car)
dat <- rnorm(100, mean=50, sd=10)
cat <- rep(c("A", "B", "C","D"), each=25)
df <- data.frame(cat,dat)
df$cat <- as.factor(df$cat)
LT <- leveneTest(dat ~ cat, data = df)
Run Code Online (Sandbox Code Playgroud)