1

要求

我的要求是让 Python 代码从数据库中提取一些记录,格式化并发布到 Slack 频道。

计划的方法

由于 Slack 消息块是 JSON,我计划

1.为每个块创建类似 JSON 的模板。例如

 json_template_str = '{{
   "type": "section",
   "fields": [
       {{
           "type": "mrkdwn",
           "text": "Today *{total_val}* customers saved {percent_derived}%."
       }}
     ]
 }}'

2.从数据库中提取记录到数据框。

3.循环数据框并{var}使用类似的东西批量替换变量.format(**locals()))

4.使用 Slack API 发布格式化的 JSON

问题

我以前没有使用过数据框。完成第 3 步的最佳方法是什么?目前我是

3.1逐个循环遍历数据框对象for i, df_row in df.iterrows():

3.2分配

    total_val= df_row['total_val']
    percent_derived= df_row['percent_derived']

3.3在循环格式中并将str添加到列表中block.append(json.loads(json_template_str.format(**locals()))

我试图在数据框中使用该assign()方法,但无法找到一种像 lambda 函数一样使用的方法来创建一个具有我可以使用的预期值的新列。

作为 pandas 的新手,我觉得可能有一种更有效的方法来做到这一点(甚至可能涉及更改 JSON 模板字符串——我完全可以做到)。很高兴听到想法和想法。

谢谢你的时间。

4

1 回答 1

1

我不会手动编写 JSON 字符串,而是创建一个相应的 python 对象,然后使用该json库将其转换为字符串。考虑到这一点,您可以尝试以下操作:

import copy
import pandas as pd

# some sample data
df = pd.DataFrame({
    'total_val': [100, 200, 300],
    'percent_derived': [12.4, 5.2, 6.5]
})

# template dictionary for a single block
json_template = {
    "type": "section",
    "fields": [
        {"type": "mrkdwn",
         "text": "Today *{total_val:.0f}* customers saved {percent_derived:.1f}%."
        }
    ]
}

# a function that will insert data from each row 
# of the dataframe into a block
def format_data(row):
    json_t = copy.deepcopy(json_template)
    text_t = json_t["fields"][0]["text"]
    json_t["fields"][0]["text"] = text_t.format(
        total_val=row['total_val'], percent_derived=row['percent_derived'])
    return json_t

# create a list of blocks
result = df.agg(format_data, axis=1).tolist()

结果列表如下所示,如果需要,可以转换为 JSON 字符串:

[{
    'type': 'section',
    'fields': [{
        'type': 'mrkdwn',
        'text': 'Today *100* customers saved 12.4%.'
    }]
}, {
    'type': 'section',
    'fields': [{
        'type': 'mrkdwn',
        'text': 'Today *200* customers saved 5.2%.'
    }]
}, {
    'type': 'section',
    'fields': [{
        'type': 'mrkdwn',
        'text': 'Today *300* customers saved 6.5%.'
    }]
}]
于 2021-11-02T04:26:06.180 回答