我有很多选项卡的 excel 文件。我想连接所有这些,一次一个标签。
我在做:
mypath = "mypath"
files = os.listdir(mypath)
files = [os.path.join(mypath,f) for f in files if f[-4:]=='xlsx']
sheets = pandas.ExcelFile(files[0]).sheet_names
Run Code Online (Sandbox Code Playgroud)
现在,假设我的选项卡是 alpha、beta、gamma 等,我想创建一个数据框列表 df_alpha、df_beta 等,它们是我目录中文件的所有 alpha 选项卡的联合。
通过做:
for sheet in sheets:
df = pandas.DataFrame()
for f in files:
df = pandas.concat([df, pandas.read_excel(f, sheet_name=sheet)])
Run Code Online (Sandbox Code Playgroud)
我可以得到我想要的,但当然我只有一个数据框,它是每个文件中最后一个选项卡的联合。如何更改代码以便我有一个 dfs 列表,每个名称都命名为 df_alpha、df_beta 等?
假设我们有 pandas dataframepd
和 dask dataframe dd
。当我想用 matplotlib 绘制 pandas 时,我可以轻松做到:
fig, ax = plt.subplots()
ax.bar(pd["series1"], pd["series2"])
fig.savefig(path)
Run Code Online (Sandbox Code Playgroud)
然而,当我尝试对 dask dataframe 执行相同操作时,我得到的Type Errors
是:
TypeError: Cannot interpret 'string[python]' as a data type
Run Code Online (Sandbox Code Playgroud)
string[python]
这只是一个示例,无论您的dd["series1"]
数据类型是什么,都将在此处输入。
所以我的问题是:使用matplotlib
with 的正确方法是什么dask
?将这两个库结合起来是否是一个好主意?
是否有任何标准或推荐的方法将版本号添加到管道(在我的例子中用 Snakemake 编写)?
例如,我有这个管道,刚才我添加了一个CHANGELOG.md
文件,其中当前版本位于顶部。是否有更好的方法来识别用户正在部署的版本?
标准化工作流程中的 Snakemake 规则使用指令运行 Python 脚本script
,例如此模板规则:
rule XXXXX:
input:
...,
output:
....,
params:
...,
conda:
"../envs/python.yaml"
script:
"../scripts/XXXX.py"
Run Code Online (Sandbox Code Playgroud)
然后在脚本中,可以使用snakemake
对象。然而,脚本与该规则紧密耦合,这似乎是一个很大的缺点。
为什么这种方法比使用调用脚本的 shell 的方法更受青睐,例如在本规则中?
rule XXXXX:
input:
...,
output:
....,
params:
absolute_script_path = ..., # get
argument1 = ...,
conda:
"../envs/python.yaml"
shell:
"python {params.absolute_script_path} {input} {params.argument1} > {output}"
Run Code Online (Sandbox Code Playgroud)
在这种方法中,python 脚本与 Snakemake 规则解耦。而且它看起来更有凝聚力,因为调用的参数在规则中很清楚,而不是隐藏在脚本中。我刚刚开始编写 Snakemake 工作流程,所以我只是一个初学者。我不明白为什么第一种方法比第二种方法更受青睐(或在标准化 Snakemake 工作流程中使用)?我错过了什么吗?第二种方法有问题吗?非常感谢您的解答!
使用joblib.Memory
我可以缓存某些函数的结果,但我想知道是否有一种有效的方法来找出有缓存值的参数列表。
例如,假设该函数slow_func
是针对 的某些值进行计算和缓存的x
,我可以找出我缓存了哪些值吗?
from joblib import Memory
mem = Memory(location='cache')
@mem.cache
def slow_func(x):
return x
Run Code Online (Sandbox Code Playgroud)