小编tee*_*pee的帖子

处理 makefile 为 Python 数据分析所做的工作的最先进方法是什么?

我有一个 DAG 程序,它处理和清理某些文件,将它们组合起来,然后进行额外的计算。我想要一种方法来运行整个分析管道,并在发生任何变化时重新运行,而不必重新处理每个组件。

我阅读了 Makefiles 并认为这听起来是完美的解决方案。我也知道它可能已经过时,并且可能存在更好的替代方案,但据我所知,我通常只找到大量不太适合此目的的工作流调度程序工具(例如,Airflow、Luigi、 Nextflow、Dagobah 等等等等)

似乎其中许多对于我并不真正需要的调度程序、GUI 等来说都是多余的。我只想要一个执行以下操作的文件:

  • 很明显所有需要运行的python脚本是什么
  • 显示文件依赖关系,以便完全重新运行只会重做上游已更改的部分
  • 有一些并行化的潜力(不是很有必要)
  • 没有太多的样板

生成文件示例:

.PHONY : dats
dats : isles.dat abyss.dat

isles.dat : books/isles.txt
    python countwords.py books/isles.txt isles.dat

abyss.dat : books/abyss.txt
    python countwords.py books/abyss.txt abyss.dat

.PHONY : clean
clean :
    rm -f *.dat
Run Code Online (Sandbox Code Playgroud)

这是在python中运行类似程序的最佳程序还是有更好的方法?

python makefile scheduled-tasks python-3.x

8
推荐指数
2
解决办法
665
查看次数

使用VBA通过代号引用另一个工作簿中的工作表

我正在尝试使用VBA将数据从一个工作簿复制到我当前的工作簿.InputBook是一个工作簿对象,指的是我想从中提取数据的文件.主要问题与引用InputBook工作簿中的特定工作表有关.在InputBook中,我有一个名为"Lines"的工作表,其代号为LINES.我更愿意通过其代号引用此工作表,例如:

NumItems = WorksheetFunction.CountA(InputBook.LINES.Columns(1))
Run Code Online (Sandbox Code Playgroud)

这显然不起作用,我知道我可以通过使用以下任一方法使其功能:

NumItems = WorksheetFunction.CountA(InputBook.Sheets("Lines").Columns(1))
NumItems = WorksheetFunction.CountA(InputBook.Sheets(2).Columns(1))
Run Code Online (Sandbox Code Playgroud)

但是,我宁愿不使用这些方法中的任何一种,因为它们看起来不那么健壮.有没有办法在另一个打开的工作簿中引用工作表对象的代号?谢谢.

excel vba excel-vba

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

创建一个基于 Pandas.DataFrame 的类,使用 pandas.read_csv() 函数进行初始化

我的目标是创建一个行为与 Pandas DataFrame 相同的对象,但在它之上有一些我自己的额外方法。据我了解,一种方法是扩展类,我首先尝试按如下方式进行:

class CustomDF(pd.DataFrame):
    def  __init__(self, filename):
        self = pd.read_csv(filename)
Run Code Online (Sandbox Code Playgroud)

但是在尝试查看此对象时出现错误,说:'CustomDF' object has no attribute '_data'.

我的第二次迭代不是继承对象,而是将其作为 DataFrame 导入对象属性之一,并让方法解决它,如下所示:

class CustomDF():

    def  __init__(self, filename):
        self.df = pd.read_csv(filename)

    def custom_method_1(self,a,b,...):
        ...

    def custom_method_2(self,a,b,...):
        ...
Run Code Online (Sandbox Code Playgroud)

这很好,除了对于所有自定义方法,我需要首先访问该self.df属性才能对其进行任何操作,但我更希望我的自定义数据框只是self.

有没有办法做到这一点?还是这种方法并不理想?

python oop class dataframe pandas

6
推荐指数
1
解决办法
3392
查看次数

Sub函数显示UserForm

我有一个包含多个UserForms的excel文件.要打开UserForm我有代码,如

Sub runAdjuster()
   Adjuster.Show
End Sub
Run Code Online (Sandbox Code Playgroud)

其中大约有5个.在保留此代码的位置方面,什么是最佳实践?我最初在一个模块中使用它,但已决定将其移动到ThisWorkbook对象.寻找通常用于保持代码清洁的提示.

excel vba excel-vba

5
推荐指数
1
解决办法
937
查看次数

将一个 Pandas DataFrame 的副本合并到另一个 DataFrame 的每一行中?

我有一个场景,我想通过将另一个较小的表合并到数据帧的每一行来扩展数据帧。

换句话说,如果较大的表是 10 行,而小表是 2 行,那么结果将是一个长度为 20 的表,其中原始表中的每一行都被复制,并且较小表中的新列被合并。

为了实现这一点,我编写了一个小函数,将一个公共列添加到每个表中,合并该列,然后删除该列。

def merge_expand(big, small):
    placeholder = "__placeholderstring__"
    big.insert(0, placeholder, 1)
    small.insert(0, placeholder, 1)
    merged = big.merge(small, how='left', on=placeholder)
    merged.drop(columns=placeholder, inplace=True)
    return merged

# example
big = pd.DataFrame({'a': [1,2,3], 'b': [4,5,6]})
small = pd.DataFrame({'id': ['aa','bb'], 'val':['a','b']})
merge_expand(big, small)

# output:
   a  b  id val
0  1  4  aa   a
1  1  4  bb   b
2  2  5  aa   a
3  2  5  bb   b
4  3  6  aa   a
5  3  6  bb …
Run Code Online (Sandbox Code Playgroud)

python merge dataframe python-3.x pandas

5
推荐指数
2
解决办法
3139
查看次数

如何在具有跨平台兼容性的 Git 提交中强制使用一致的行结尾

在与使用不同操作系统的人一起工作时,由于行结束,我遇到了合并冲突问题。我在 Windows 上工作,我的同事在 Mac 上工作。当他推送他的更改时,有时他没有处理过的文件会在 diff 中显示为已更改,因为现在^M每个文件上都会显示行尾。这导致了合并冲突。我在 Git 文档中阅读了以下内容:

当您将文件添加到索引时,Git 可以通过将 CRLF 行结尾自动转换为 LF 来处理此问题,反之亦然,当它检出代码到您的文件系统时。您可以使用 core.autocrlf 设置打开此功能。如果您使用的是 Windows 计算机,请将其设置为 true?—?这会在您检出代码时将 LF 结尾转换为 CRLF:

$ git config --global core.autocrlf true 如果你在使用 LF 行尾的 Linux 或 macOS 系统上,那么你不希望 Git 在检出文件时自动转换它们;但是,如果意外引入了带有 CRLF 结尾的文件,那么您可能需要 Git 修复它。您可以通过将 core.autocrlf 设置为输入来告诉 Git 在提交时将 CRLF 转换为 LF,而不是相反:

$ git config --global core.autocrlf input 这个设置应该让你在 Windows 结账中使用 CRLF 结尾,但在 macOS 和 Linux 系统以及存储库中使用 LF 结尾。

这是有道理的,但我仍然不清楚这些文件是如何在 repo 中实际提交的。例如,如果他在他的系统上创建一个文件,它会有所有的LF行结尾,对吗?因此,当他提交时,我认为这些行结尾保持原样。据我所知,当我拉动时,我的autocrlf存在true会用CRLF行尾检查它们。(我收到警告warning: …

windows git merge line-endings git-merge

5
推荐指数
2
解决办法
2050
查看次数

如何避免 Pandas DataFrame 中过多的 lambda 函数分配和应用方法链

我正在尝试将 R 中数据帧的操作管道转换为其 Python 等效项。管道的一个基本示例如下,包含一些mutatefilter调用:

library(tidyverse)

calc_circle_area <- function(diam) pi / 4 * diam^2
calc_cylinder_vol <- function(area, length) area * length

raw_data <- tibble(cylinder_name=c('a', 'b', 'c'), length=c(3, 5, 9), diam=c(1, 2, 4))

new_table <- raw_data %>% 
  mutate(area = calc_circle_area(diam)) %>% 
  mutate(vol = calc_cylinder_vol(area, length)) %>% 
  mutate(is_small_vol = vol < 100) %>% 
  filter(is_small_vol)
Run Code Online (Sandbox Code Playgroud)

我可以在熊猫复制这个没有太多的麻烦,但发现它涉及到一些嵌套lambda使用时调用assign做一个apply(第一,其中数据帧来电者是一个参数,随后与数据框行作为参数)。这往往会掩盖赋值调用的含义,如果可能的话,我想在其中指定更切题的内容(如 R 版本)。

import pandas as pd
import math

calc_circle_area = lambda diam: math.pi / 4 * diam**2 …
Run Code Online (Sandbox Code Playgroud)

python r python-3.x pandas tidyverse

5
推荐指数
1
解决办法
405
查看次数

当范围只包含一个值时,函数不会返回数组

我有一个函数用于返回一个由单列数据列表创建的数组.我一直使用这个函数的返回值作为一个伪全局变量(LINENAMES_ARRAY),我传递给许多函数.这些函数比检查它If Len(Join(LINENAMES_ARRAY)) = 0 Then或者通过带有For Each语句的项目进行检查.这是代码:

  Function LINENAMES_ARRAY() As Variant
  'returns an array of all items in the main sheet linenames column
      LINENAMES_ARRAY = Application.Transpose(MAIN.Range( _
      MAIN.Cells(MAIN_HEAD_COUNT + 1, MAIN_LINENAMES_COLUMN), _
      MAIN.Cells(LINENAMES_COUNT + 1, MAIN_LINENAMES_COLUMN)))
  End Function
Run Code Online (Sandbox Code Playgroud)

我最近偶然发现了其中一个你看不到它直到你看到它的问题,同时将这个工作簿用于一个新项目,如果数组恰好只有1个元素,那么一切都会失败.显然在这种情况下,这会返回一个值,因此Join()也会失败For Each __ in LINENAMES_ARRAY.为什么不将它视为1x1数组而不是自由值?我已经开始通过重写调用它的函数来缓解这个问题,检查它是否是一个数组,然后再做一些其他的过程.像:

For j = 1 To LINENAMES_COUNT
    LINES_BOX.AddItem lineNames(j)
Next j
Run Code Online (Sandbox Code Playgroud)

改为:

If Not IsArray(LINENAMES_ARRAY) Then
     myListBox.AddItem CStr(LINENAMES_ARRAY)
Else
    For j = 1 To LINENAMES_COUNT
       LINES_BOX.AddItem LINENAMES_ARRAY(j)
    Next j …
Run Code Online (Sandbox Code Playgroud)

excel vba excel-vba

3
推荐指数
1
解决办法
485
查看次数

pathlib Path.rglob 在 Windows 中的长文件路径上失败

我正在尝试返回特定位置中所有文件和子文件夹的列表。我的代码如下:

from pathlib import Path
FOLDER_PATH = Path(r'C:\long\file\path\of\138\characters\')
Run Code Online (Sandbox Code Playgroud)

我收到错误: FileNotFoundError: [WinError 3] The system cannot find the path specified:

错误发生在文件夹路径上,而不是文件上,所以我不确定这是否可能是原因。

当我手动进入文件夹并尝试在其中打开文件夹时PDF,我收到“打开此文档时出错。找不到此文件。”

同样,当我尝试打开XLSX文件时,我得到“无法访问此文件。尝试以下操作之一:(确保它存在,不是只读的,不超过 218 个字符等)”

此文件夹中的文件路径肯定超过 218 个字符,我知道这可能是 Excel 的问题,但我不明白为什么pathlib.Path.rglob列出它们会有问题,有人理解吗?

但是,如果我使用CMD( dir /s /b > files.txt) 我可以得到列表。

此外,如果我随后在 python 中导入对象files.txt列表 ,并尝试执行,它将无法将某些较长的路径正确识别为文件。Pathpaths[x.is_file() for x in paths]

我已经验证,如果我在本地复制目录(其中存在更短的路径),则 Excel 和pathlib.Path.rglob.

可以做些什么来解决这个问题,为什么它首先是一个问题?

python path python-3.x pathlib

3
推荐指数
1
解决办法
1542
查看次数

VBA Excel:将范围值分配给新范围

我无法将值从一个工作簿范围分配到当前工作簿中的范围.当我使用Range("A1:C1")分配我的范围时,此代码可以正常工作,但是当使用Range(Cells(1,1),Cells(1,3))定义我的范围时,该函数将失败:

Sub CopyRange()
    Dim inputExcel As Excel.Application, BookA As Workbook
    Path_A = ThisWorkbook.Path & "\Book_A.xlsx"
    Set inputExcel = New Excel.Application
    Set BookA = inputExcel.Workbooks.Open(Path_A, ReadOnly:=True)

    'THIS WORKS:
    ThisWorkbook.Sheets(1).Range("A1:C1").Value = _
    BookA.Sheets(1).Range("A1:C1").Value

    'THIS DOESN'T WORK:
    ThisWorkbook.Sheets(1).Range(Cells(1, 1), Cells(1, 3)).Value = _
    BookA.Sheets(1).Range(Cells(1, 1), Cells(1, 3)).Value
End Sub
Run Code Online (Sandbox Code Playgroud)

我知道这必须是一个简单的语法问题,但我无法弄明白.如何使用"单元格"工作来获取范围分配?

excel vba range excel-vba cells

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

VBA将列表框传递给函数

我试图通过将我的列表框对象传递给子函数来填充列表框,但每当我运行它时,我都会遇到类型不匹配错误.我将对象MAIN.BoxY1传递给函数FillListBox,其中MAIN是列表框所在的工作表的代号,BoxY1是我的列表框名称(ActiveX).当我改变FillListBox函数以包含MAIN.BoxY1而不是每个实例的MyBox时,它将正常工作.将列表框传递给另一个函数的正确方法是什么?

Sub FillListBox(MyBox As ListBox, DataList As Variant)
    MyBox.MultiSelect = 1
    For j = 1 To NumOutputs
        MyBox.AddItem DataList(j)
    Next j
End Sub

Sub BoxY1_Fill()
    FillListBox MAIN.BoxY1, TheData
End Sub
Run Code Online (Sandbox Code Playgroud)

 

excel vba excel-vba

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

以结构化方式命名全局变量

我当前的项目具有全局常量,用于定义此项目将搜索的工作簿中的某些行和列.我已经将它们定义为:

Public Const headRow As Integer = 1
Public Const descRow As Integer = 2
Public Const pnumCol As Integer = 1
Public Const teamCol As Integer = 2
Public Const dateCol As Integer = 3
Public Const hourCol As Integer = 4
Public Const typeCol As Integer = 5
Public Const taskCol As Integer = 6
Public Const noteCol As Integer = 7
Run Code Online (Sandbox Code Playgroud)

我想知道是否有更清晰的方法来定义这些,这将允许我以这样的方式写这些:

ColumnNums.team
ColumnNums.task
ColumnNums.note     'etc
Run Code Online (Sandbox Code Playgroud)

我认为可以通过定义我自己的类型来完成与此相似的事情,但这可能不值得.我基本上希望这是一个简单的方法来记住变量名称,因为我编写了更多代码,以及能够计算每组中有多少项目.在这种情况下,类型或集合是否有用?

excel vba excel-vba

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

使用Shell函数运行exe时发现文件未找到错误

我正在运行一个userform,它应该运行一个exe文件,在工作文件夹中找到,如下所示:

Sub RunProcessor()
    If MsgBox("Run simulation?", vbYesNo) = vbNo Then
      Exit Sub
    Else
      ChDir ThisWorkbook.Path
      Shell ("runsims.exe")
    End If
End Sub
Run Code Online (Sandbox Code Playgroud)

这在我的本地驱动器上工作正常,但是当我将所有内容移动到服务器驱动器时(Shell函数调用行上的运行时错误5),它开始失败.

我知道在cmd中,当你在C:盘上工作并cd L:\...\...\打电话时,你也需要输入L:,所以我试着将这行代码插入到另一个Shell调用之上:Shell (Left(ThisWorkbook.Path, 2))但是这也失败了.我怎么能运行"runsims.exe",因为它总是在当前的工作驱动器中?

excel vba excel-vba

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