gpt4 book ai didi

python - 在数据科学项目中引用文件的优雅方式

转载 作者:太空狗 更新时间:2023-10-29 21:09:16 25 4
gpt4 key购买 nike

最近几天我学习了如何构建数据科学项目以使其简单、可重用和 Pythonic。坚持this guideline我已经创建了 my_project。您可以在下面看到它的结构。

├── README.md          
├── data
│ ├── processed <-- data files
│ └── raw
├── notebooks
| └── notebook_1
├── setup.py
|
├── settings.py <-- settings file
└── src
├── __init__.py

└── data
└── get_data.py <-- script

我定义了一个从 .data/processed 加载数据的函数。我想在其他脚本以及位于 .notebooks 中的 jupyter 笔记本中使用此功能。

def data_sample(code=None):
df = pd.read_parquet('../../data/processed/my_data')
if not code:
code = random.choice(df.code.unique())
df = df[df.code == code].sort_values('Date')
return df

很明显,除非我在定义它的脚本中直接运行它,否则这个函数在任何地方都不起作用。我的想法是创建 settings.py 我要声明的地方:

from os.path import join, dirname

DATA_DIR = join(dirname(__file__), 'data', 'processed')

所以现在我可以写:

from my_project import settings
import os

def data_sample(code=None):
file_path = os.path.join(settings.DATA_DIR, 'my_data')
df = pd.read_parquet(file_path)
if not code:
code = random.choice(df.code.unique())
df = df[df.code == code].sort_values('Date')
return df

问题:

  1. 以这种方式引用文件是常见的做法吗? settings.DATA_DIR 看起来有点丑。

  2. settings.py 应该这样使用吗?它应该放在这个目录中吗?我在这个 repo 的不同地方看到过它在 .samr/settings.py

我知道可能没有“唯一正确答案”,我只是试图找到处理这些事情的合乎逻辑、优雅的方式。

最佳答案

我正在维护一个基于 DataDriven Cookiecutter 的经济数据项目,我认为这是一个很棒的模板。

将数据文件夹和代码分开对我来说似乎是一个优势,允许将您的工作视为定向的转换流('DAG'),从不可变的初始数据开始,然后进入中期和最终结果。

最初,我回顾了pkg_resources ,但拒绝使用它(语法长且缺乏理解创建包的能力)以支持在目录中导航的自己的辅助函数/类。

本质上,助手做两件事

1.在 constansts 中保留项目根文件夹和其他一些路径:

# shorter version 
ROOT = Path(__file__).parents[3]

# longer version
def find_repo_root():
"""Returns root folder for repository.
Current file is assumed to be:
<repo_root>/src/kep/helper/<this file>.py
"""
levels_up = 3
return Path(__file__).parents[levels_up]

ROOT = find_repo_root()
DATA_FOLDER = ROOT / 'data'
UNPACK_RAR_EXE = str(ROOT / 'bin' / 'UnRAR.exe')
XL_PATH = str(ROOT / 'output' / 'kep.xlsx')

这与您对 DATA_DIR 所做的类似。一个可能的弱点是,在这里我手动硬编码帮助文件相对于项目根目录的相对位置。如果移动了帮助文件位置,则需要进行调整。但是,嘿,这与在 Django 中完成的方式相同.

2。允许访问 rawinterimprocessed 文件夹中的特定数据。

这可以是一个简单的函数,通过文件夹中的文件名返回完整路径,例如:

def interim(filename):
"""Return path for *filename* in 'data/interim folder'."""
return str(ROOT / 'data' / 'interim' / filename)

在我的项目中,我有用于interimprocessed 目录的年-月子文件夹,我按年、月和有时频率处理数据。对于这个数据结构,我有InterimCSVProcessedCSV 类提供引用特定路径,例如:

from . helper import ProcessedCSV, InterimCSV
# somewhere in code
csv_text = InterimCSV(self.year, self.month).text()
# later in code
path = ProcessedCSV(2018,4).path(freq='q')

助手代码 is here .此外,如果子文件夹不存在,这些类会创建子文件夹(我希望它用于临时目录中的单元测试),并且有检查文件是否存在和读取其内容的方法。

在您的示例中,您可以轻松地将根目录固定在 setting.py 中,但我认为您可以进一步抽象数据。

目前 data_sample() 混合了文件访问和数据转换,这不是一个好兆头,而且还使用了全局名称,这是函数的另一个坏兆头。我建议您可以考虑以下内容:

# keep this in setting.py
def processed(filename):
return os.path.join(DATA_DIR, filename)

# this works on a dataframe - your argument is a dataframe,
# and you return a dataframe
def transform_sample(df: pd.DataFrame, code=None) -> pd.DataFrame:
# FIXME: what is `code`?
if not code:
code = random.choice(df.code.unique())
return df[df.code == code].sort_values('Date')

# make a small but elegant pipeline of data transfomation
file_path = processed('my_data')
df0 = pd.read_parquet(file_path)
df = transform_sample(df0)

关于python - 在数据科学项目中引用文件的优雅方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50966453/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com