小编spa*_*ead的帖子

通过Gradle运行Java类时传递系统属性和参数的问题

我试图通过Gradle运行命令行Java应用程序作为快速集成测试的一部分.我正在从Maven移植我的构建脚本,这很容易通过exec-maven-plugin.我的两大要求是:

  • 能够将系统属性传递给可执行Java代码
  • 能够将命令行参数传递给可执行Java代码

请注意,我不是试图在构建脚本中读取这些属性,我试图在脚本构建和执行的Java程序中读取它们.

我找到了另外两个SO帖子,它们通过Gradle处理Java程序执行:一个答案主张apply plugin: "application"在构建文件和gradle run命令行中使用,另一个答案提倡该方法以及task execute(type:JavaExec)在构建文件和构建文件gradle execute中使用命令行.我尝试了两种方法,但没有成功.

我有两个问题:

(1)我无法获取Java可执行文件来读取系统属性

我是否这样做:

build.gradle:

apply plugin: 'application'
mainClassName = "com.mycompany.MyMain"
Run Code Online (Sandbox Code Playgroud)

命令行:

gradle run -Dmyproperty=myvalue
Run Code Online (Sandbox Code Playgroud)

或这个:

build.gradle:

task execute (type:JavaExec) {
    main = "com.mycompany.MyMain"
    classpath = sourceSets.main.runtimeClasspath 
}
Run Code Online (Sandbox Code Playgroud)

命令行:

gradle execute -Dmyproperty=myvalue
Run Code Online (Sandbox Code Playgroud)

无论哪种情况,myproperty都无法完成.从开始运行的代码MyMain.main (...)myproperty系统属性读取为null/missing.

(2)我无法传递命令行参数

这可能与第一个问题有关.在exec-maven-plugin,例如,命令行参数本身也是经由系统属性传递英寸 这是Gradle的情况,还是有另一种传递命令行参数的方法?

我如何通过这些变量?另外,使用apply plugin: 'application'或更好task execute (type:JavaExec) …

java gradle

77
推荐指数
2
解决办法
6万
查看次数

mapToDouble()是否真的需要将List <Double>与Java 8流相加?

据我所知,List<Double>使用Java 8流总结的方法是这样的:

List<Double> vals = . . . ;
double sum = vals.stream().mapToDouble(Double::doubleValue).sum();
Run Code Online (Sandbox Code Playgroud)

对我来说,这mapToDouble(Double::doubleValue)似乎是一种狡猾 - 只是那种lambdas和溪流应该免除的样板"仪式".

最佳实践告诉我们更喜欢List实例而不是数组,但是对于这种求和,数组似乎更清晰:

double[] vals = . . . ;
double sum = Arrays.stream(vals).sum();
Run Code Online (Sandbox Code Playgroud)

当然,人们可以这样做:

List<Double> vals = . . . ;
double sum = vals.stream().reduce(0.0, (i,j) -> i+j);
Run Code Online (Sandbox Code Playgroud)

但那reduce(....)比这长得多sum().

我知道这与流需要围绕Java的非对象原语进行改造的方式有关,但是,我在这里遗漏了一些东西吗?有没有办法挤压自动装箱以缩短它?或者这仅仅是当前最先进的技术?


更新 - 答案摘要

以下是答案的摘要.虽然我在这里有一个摘要,但我敦促读者自己仔细阅读答案.

@dasblinkenlight解释说,由于Java历史上的进一步决策,特别是在实现泛型的方式以及它们与非对象原语的关系中,因此总是需要某种拆箱.他指出,理论上编译器可以直接进行拆箱并允许使用简短的代码,但这还没有实现.

@Holger展示了一个非常接近我所询问的表现力的解决方案:

double sum = vals.stream().reduce(0.0, Double::sum);
Run Code Online (Sandbox Code Playgroud)

我不知道新的静态Double.sum()方法.添加1.8,似乎是出于我描述的目的.我也发现了Double.min()Double.max().展望未来,我肯定会使用这个成语来进行类似的操作List<Double>.

java java-8 java-stream

65
推荐指数
3
解决办法
4万
查看次数

大熊猫切割无限上/下限

熊猫cut()文档规定:"出界的值将是NA在所得范畴对象".当上限不一定清楚或重要时,这使得困难.例如:

cut (weight, bins=[10,50,100,200])
Run Code Online (Sandbox Code Playgroud)

将生产垃圾箱:

[(10, 50] < (50, 100] < (100, 200]]
Run Code Online (Sandbox Code Playgroud)

所以cut (250, bins=[10,50,100,200])会产生NaN,因为意志cut (5, bins=[10,50,100,200]).我正在尝试做的是产生> 200第一个例子和< 10第二个例子.

我意识到我能做到cut (weight, bins=[float("inf"),10,50,100,200,float("inf")])或等同,但我所遵循的报告风格不允许这样的事情(200, inf].我也意识到我实际上可以通过labels参数on 指定自定义标签cut(),但这意味着每次调整时都要记住调整它们bins,这可能是经常的.

有我用尽了所有的可能性,或者是有什么在cut()或其他地方pandas,这将有助于我做到这一点?我正在考虑为它编写一个包装器函数,cut()它会自动生成所需格式的标签,但我想先在这里查看.

python pandas

17
推荐指数
3
解决办法
6925
查看次数

PyCharm可以自动生成__eq __()和__hash __()实现吗?

我是PyCharm新手,但是长期使用IntelliJ用户.在IntelliJ中,当您编写类定义时,IDE可以基于实例变量自动生成构造函数,equals()方法和hashCode()方法.这是好事,不仅对保存打字,但为了防止意外的错误,并在某些自动投掷equals()hashCode()最佳实践.

鉴于产品来自同一家公司,我希望PyCharm能做同样的事情.经过大量的谷歌搜索和搜索文档,我找不到任何东西__eq__()__hash__().当然,Python实例变量没有明确指定,但我希望生成器可以遵循一个约定,例如提供所有__init()__参数作为潜在的实例变量.至于__init__(),我发现了一些会自动添加实例变量设置的东西__init__(),但是这种方法似乎比单独输入更麻烦,而且它甚至不会将实例变量作为参数添加到__init__()签名中.

我是否遗漏了文档中的任何内容,或者可能有一个可以执行此操作的插件?

更新:要清楚,我正在寻找能够生成这些方法的实际实现的东西.也就是说,如果我有称为类Point和PyCharm知道我的学生都xy实例变量,那么它会自动生成该的__eq__()方法:

def __eq__(self, other):
    if not isinstance(other, Point):
        return NotImplemented
    elif self is other:
        return True
    else:
        return self.x == other.x and self.y == other.y
Run Code Online (Sandbox Code Playgroud)

在IntelliJ中可以轻松完成等效操作.

python intellij-idea pycharm

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

Pandas按值排序,然后按索引排序

我有以下数据集:

import numpy as np
from pandas import DataFrame
import numpy.random as random

random.seed(12)

df = DataFrame (
    {
        "fac1" : ["a","a","a","a","b","b","b","b"] ,
        "val" : random.choice(np.arange(0,20), 8, replace=False)
    }
)
df2 = df.set_index(["fac1"])
df2
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我想要的是val在每个fac1组内进行排序,以产生这个:

在此输入图像描述

我已经梳理了文档,找不到简单明了的方法.我能做的最好的是以下黑客攻击:

df3 = df2.reset_index()
df4 = df3.sort_values(["fac1","val"],ascending=[True,True],axis=0)
df5 = df4.set_index(["fac1"])
df5
# Produces the picture above
Run Code Online (Sandbox Code Playgroud)

(我意识到以上可以从多种inplace选择中受益,只需这样做就可以使中间产品变得清晰).

我找到了这个SO帖子,它使用了分组和排序功能.但是,从该帖子改编的以下代码产生了错误的结果:

df2.groupby("fac1",axis=1).apply(lambda x : x.sort_values("val"))
Run Code Online (Sandbox Code Playgroud)

(出于空间考虑,删除了输出)

还有另一种方法来解决这个问题吗?

更新:解决方案

接受的解决方案是:

df2.sort_values(by='val').sort_index(kind='mergesort')
Run Code Online (Sandbox Code Playgroud)

排序算法必须是mergesort并且必须明确指定,因为它不是默认值.由于sort_index文件指出,"归并是唯一稳定的算法." …

python pandas

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

让statsmodels使用heteroskedasticity修正系数t检验中的标准误差

我一直在深入研究API,并且已经找到了如何检索不同类型的异方差校正标准误差(通过属性等等)但是,我无法弄清楚如何获得系数的t-测试使用这些更正的标准错误.有没有办法在API中执行此操作,还是必须手动执行此操作?如果是后者,您是否可以就如何使用statsmodels结果建议任何指导? statsmodels.regression.linear_model.RegressionResultsHC0_se

python regression statsmodels

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

在Python/Pandas中创建部分SAS PROC SUMMARY替换

我们正在努力摆脱SAS和Python/Pandas.但是,我们遇到麻烦的一件事是创建具有SAS例程灵活性的PROC SUMMARY(AKA PROC MEANS)替代品.对于非SAS用户:PROC SUMMARY只是一个例程,用于生成一个表,其中包含数据集中"所有观察或观察组内变量的描述性统计",以解释SAS文档.我们的要求只是完整功能的一小部分 - 输出我们拥有的表格:

  • 能够将不同的统计数据应用于不同的列(现在只是计数,总和,平均值,加权平均值)
  • 能够处理零到多个分组变量
  • 能够为加权平均值指定权重变量

我们不会尝试做任何其他事情(任何图形化等)

这是我们迄今为止所拥有的:

def wmean_ungrouped (d,w):
    return (d.dot(w)).sum() / w.sum()

def wmean_grouped (group, var_name_in, var_name_weight):
    d = group[var_name_in]
    w = group[var_name_weight]
    return (d * w).sum() / w.sum()

FUNCS = {
    "mean"   : np.mean ,
    "sum"   : np.sum ,
    "count" : np.count_nonzero
}

def my_summary (
        data ,
        var_names_in ,
        var_names_out ,
        var_functions ,
        var_name_weight = None ,
        var_names_group = None
):
    result = DataFrame()

    if var_names_group …
Run Code Online (Sandbox Code Playgroud)

python pandas

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

Python:为什么str.split()返回一个列表而str.partition()返回一个元组?

比较Python的str.split()使用str.partition(),我看到,他们不仅具有不同的功能(split()标记化在出现的每个分隔整个字符串,而partition()只是返回所有之前和之后都在第一分隔符发生),但他们也有不同的返回类型.也就是说,str.split()返回一段list时间str.partition()返回一个tuple.这是重要的,因为a list是可变的而a tuple则不是.在API设计中有这种选择背后有任何故意的理由,还是"只是事物的方式".我好奇.

python

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

将pandas/matplotlib映像直接写入XLSX文件

我在pandas/matplotlib中生成图并希望将它们写入XLSX文件.我不打算创建原生Excel图表; 我只是把这些情节写成非交互式图像.我正在使用XlsxWriter库/引擎.

我找到的最接近的解决方案是这个SO问题的答案,它建议使用XlsxWriter.write_image()方法.但是,此方法似乎将文件名作为输入.我试图以编程方式从pandas/matplotlib plot()调用传递直接输出,例如:

h = results.resid.hist()
worksheet.insert_image(row, 0, h) # doesn't work
Run Code Online (Sandbox Code Playgroud)

或这个:

s = df.plot(kind="scatter", x="some_x_variable", y="resid")
worksheet.insert_image(row, 0, s) # doesn't work
Run Code Online (Sandbox Code Playgroud)

有没有办法实现这一点,缺少首先将图像写入磁盘文件的解决方法?

更新

下面的回答让我走上正轨并接受了.我需要进行一些更改,主要是(我认为),因为我使用的是Python 3,也许还有一些API更改.这是解决方案:

from io import BytesIO
import matplotlib.pyplot as plt

imgdata = BytesIO()
fig, ax = plt.subplots()
results.resid.hist(ax=ax)
fig.savefig(imgdata, format="png")
imgdata.seek(0)

worksheet.insert_image(
    row, 0, "",
    {'image_data': imgdata}
)
Run Code Online (Sandbox Code Playgroud)

""insert_image()代码欺骗Excel中,这仍然是期待一个文件名/ URL /等.

python excel matplotlib pandas xlsxwriter

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

Pandas/Excel:在调用 DataFrame.to_excel() 时,有什么方法可以将 ALT-ENTER / CHAR(10) 行中断编码为数据?

我有一个DataFrame想要写入 Excel的熊猫。对于一列,我的数据值是以逗号分隔的字符串,例如"val1,val2""val1,val2,val3"。当我编写该列时,我想将逗号替换为相当于ALT-ENTER在 Excel中按,以便在值之间有换行符。因此,我的第一个示例将显示为val1,然后是单元格内的中断,然后是val2,依此类推。您也可以在 Excel 中通过将单元格设为公式并&"char(10)"&在每个值之间放置来执行此操作。

我看到了如何通过 XLSXWriter编写公式并单独编写单元格来做到这一点。但是,我希望(或懒惰地)想知道是否有一种方法可以将中断直接编码到数据中,以便它们都可以通过to_excel()DataFrame.

python excel pandas

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