我正在使用java程序从数据库中获取一些数据.然后我计算一些数字并开始将它们存储在一个数组中.我正在使用的机器有4台RAM.现在,我不知道预先会有多少数字,所以我使用了ArrayList<Double>.但是我知道会有大致的数字300 million numbers.
因此,由于一个double是8个字节,因此该数组将消耗的内存的粗略估计是2.4 gigs(可能更多是因为ArrayList的开销).在此之后,我想计算这个数组的中位数,并使用org.apache.commons.math3.stat.descriptive.rank.Median作为double[]数组输入的库.所以,我需要转换ArrayList<Double>为double[].
我确实看到了很多问题,并且他们都提到没有办法绕过整个阵列.现在这很好,但由于它们也将两个对象都保存在内存中,这使我的内存需求高达4.8演出.现在我们遇到了一个问题,因为总RAM可用我们4演出.
首先,我怀疑该程序在某些时候会给我一个正确的内存错误(它当前正在运行)?如果是这样,我如何计算中位数而不必分配双倍内存?我想避免排序数组,因为计算中位数是O(n).
有没有办法找到未排序数组的中位数:1-没有排序它.2-不使用选择算法,也不使用中位数的中位数
我发现了许多类似于我的其他问题.但是解决方案,其中大部分,如果不是全部,都讨论了SelectProblem和MedianOfMedians
我试图将矩阵的每列中的NA替换为该列的中值,但是当我尝试使用lapply或者sapply我得到错误时; 当我使用for循环时,代码工作,当我一次更改一列时,我做错了什么?
例:
set.seed(1928)
mat <- matrix(rnorm(100*110), ncol = 110)
mat[sample(1:length(mat), 700, replace = FALSE)] <- NA
mat1 <- mat2 <- mat
mat1 <- lapply(mat1,
function(n) {
mat1[is.na(mat1[,n]),n] <- median(mat1[,n], na.rm = TRUE)
}
)
for (n in 1:ncol(mat2)) {
mat2[is.na(mat2[,n]),n] <- median(mat2[,n], na.rm = TRUE)
}
Run Code Online (Sandbox Code Playgroud) 我试图找到一种方法来计算给定数据帧的中位数.
val df = sc.parallelize(Seq(("a",1.0),("a",2.0),("a",3.0),("b",6.0), ("b", 8.0))).toDF("col1", "col2")
+----+----+
|col1|col2|
+----+----+
| a| 1.0|
| a| 2.0|
| a| 3.0|
| b| 6.0|
| b| 8.0|
+----+----+
Run Code Online (Sandbox Code Playgroud)
现在我想做那样的事情:
df.groupBy("col1").agg(calcmedian("col2"))
结果应如下所示:
+----+------+
|col1|median|
+----+------+
| a| 2.0|
| b| 7.0|
+----+------+`
Run Code Online (Sandbox Code Playgroud)
因此calcmedian()必须是UDAF,但问题是,UDAF的"evaluate"方法只需要一行,但我需要整个表来对值进行排序并返回中位数...
// Once all entries for a group are exhausted, spark will evaluate to get the final result
def evaluate(buffer: Row) = {...}
Run Code Online (Sandbox Code Playgroud)
这有可能吗?或者还有另一个不错的解决方法吗?我想强调,我知道如何计算"一组"数据集的中位数.但我不想在"foreach"循环中使用此算法,因为这是低效的!
谢谢!
编辑:
这是我到目前为止所尝试的:
object calcMedian extends UserDefinedAggregateFunction {
// Schema you get as an input
def …Run Code Online (Sandbox Code Playgroud) 我借用了一些代码,试图实现一个函数来计算大量数据的运行中位数。当前的对我来说太慢了(棘手的部分是我需要从正在运行的框中排除所有零)。下面是代码:
from itertools import islice
from collections import deque
from bisect import bisect_left,insort
def median(s):
sp = [nz for nz in s if nz!=0]
print sp
Mnow = len(sp)
if Mnow == 0:
return 0
else:
return np.median(sp)
def RunningMedian(seq, M):
seq = iter(seq)
s = []
# Set up list s (to be sorted) and load deque with first window of seq
s = [item for item in islice(seq,M)]
d = deque(s)
# Sort it in increasing …Run Code Online (Sandbox Code Playgroud) Customer id Year a b
1 2000 10 2
1 2001 5 3
1 2002 NA 4
1 2003 NA 5
2 2000 2 NA
2 2001 NA 4
2 2002 4 NA
2 2003 8 10
3 2000 9 NA
3 2001 10 NA
3 2002 11 12
Run Code Online (Sandbox Code Playgroud) 我现在停留在postgres的计算中位数,因为在postgres中没有计算中位数的功能。以下是我的查询,我想获取该查询的中值。请帮我怎么做。
SELECT count, conversion, company_id FROM (SELECT count(ap.id),
(count(ap.id)/cast(NULLIF(SUM(j.views), 0) as float) * 100) AS conversion,
j.company_id FROM applications ap RIGHT JOIN jobs j ON ap.job_id = j.id GROUP BY j.company_id order by conversion) with_avg
Run Code Online (Sandbox Code Playgroud) 我想弄清楚如何计算一组随机生成的数字的中位数。我已经设置了所有数组,但是我在为计算组合一个函数时遇到了麻烦。
这是我到目前为止:
//array
$lessFifty = array();
$moreFifty = array();
//number generation
for ($i = 0; $i<=30; $i++) {
$number = rand(0, 100);
//Sorting <50>
if ($number < 50 ) {
$lessFifty[] = $number;
} else {
$moreFifty[] = $number;
}
}
echo print_r($lessFifty);
echo "<br>" ;
echo print_r($moreFifty);
//Average
echo "<p> Average of values less than fifty: </p>";
print array_sum($lessFifty) / count($lessFifty) ;
echo "<p> Average of values greater than fifty: </p>" ;
print array_sum($moreFifty) / count($moreFifty) ;
//Median
$func …Run Code Online (Sandbox Code Playgroud) 这是我的数据框:
cars_num_df.head(10)
mpg cylinders displacement horsepower weight acceleration age
0 18.0 8 307.0 130.0 3504.0 12.0 13
1 15.0 8 350.0 165.0 3693.0 11.5 13
2 18.0 8 318.0 150.0 3436.0 11.0 13
3 16.0 8 304.0 150.0 3433.0 12.0 13
4 17.0 8 302.0 140.0 3449.0 10.5 13
5 15.0 8 429.0 198.0 4341.0 10.0 13
6 14.0 8 454.0 220.0 4354.0 9.0 13
7 14.0 8 440.0 215.0 4312.0 8.5 13
8 14.0 8 455.0 225.0 4425.0 10.0 …Run Code Online (Sandbox Code Playgroud) Presto SQL 中似乎没有为此目的的本机函数。你知道有什么方法可以有效地聚合一个组并返回它的中位数吗?