Life is short, you need Python.

人生苦短,我用 Python。


Python 是什么

Python 是一种图灵完备的高级计算机语言,可以用来解决计算机可以解决的任何可计算问题。

<aside> 💡 Wikipedia 在可计算性理论,如果一系列操作数据的规则(如指令集编程语言细胞自动机)可以用来模拟任何图灵机,那么它便符合图灵完备Turing-completecomputationally universal)。这意味着这个系统也可以识别其他数据处理规则集,图灵完备性被用作表达这种数据处理规则集的一种属性。如今,几乎所有编程语言都是具有图灵完备性的。这个词以引入图灵机概念的数学家艾伦·图灵命名。

Excel 公式为非图灵完备的语言,只能解决 Excel 软件内特定的问题。 图灵完备就像一台全功能的工具箱,可以解决计算机可计算解决的一切问题。

</aside>

小试牛刀:在中国人民银行官网获取上个月最后一个公告的美元对人民币汇率:

import requests
from bs4 import BeautifulSoup
import re
from datetime import datetime

def get_last_month_exchange_rate():
    # 修改这个网址为你的目标网址
    target_url = "<http://www.pbc.gov.cn/zhengcehuobisi/125207/125217/125925/index.html>"
    host_name = "<http://www.pbc.gov.cn>"
    
    # 获取网页内容
    response = requests.get(target_url)
    response.encoding = 'utf-8'

    # BeautifulSoup解析网页
    soup = BeautifulSoup(response.text, 'html.parser')

    # 找到所有公告,获取日期和链接
    announcements = [{
        'date': datetime.strptime(a.split("中国")[0], '%Y年%m月%d日'),
        'url': host_name + a.find_previous('a').get('href'),
    } for a in soup.find_all(text=re.compile("(\\d{4}年\\d{1,2}月\\d{1,2}日).*人民币汇率中间价公告"))]

    # 排序所有公告
    sorted_announcements = sorted(announcements, key=lambda x: x['date'], reverse=True)

    # 找到日期最新的上一个月的公告
    year, month = sorted_announcements[0]['date'].year, sorted_announcements[0]['date'].month
    last_month_announcements = [a for a in sorted_announcements if a['date'].year == year and a['date'].month == month%12] if month != 1 else [a for a in sorted_announcements if a['date'].year == year - 1 and a['date'].month == 12]
    announcement_url = last_month_announcements[0]['url']

    # 获取公告内容
    announcement_response = requests.get(announcement_url)
    announcement_response.encoding = 'utf-8'

    # 提取汇率
    rate_pattern = re.compile("1美元对人民币(\\d+\\.\\d+)元")
    rate = re.search(rate_pattern, announcement_response.text).group(1)

    return rate

print(get_last_month_exchange_rate())

为什么是 Python

  1. 初学者友好,语法接近自然语言,相同功能,常见编程语言中一般 Python 编写行数最少
  2. 数据处理方面功能丰富,网络上相关问题、讨论较多

Python 与数据处理

初步感受 pandas:

import pandas as pd

df = pd.read_excel(file_path, sheet_name='对账文件')
trade_filter_df = df[df['业务类型'] == '收单']
refund_filter_df = df[df['业务类型'] == '退款']
total_fee = trade_filter_df['收入(元)'].sum()
refund_fee = refund_filter_df['支出(元)'].sum()
print(total_fee, refund_fee)
import pandas as pd

df_101 = pd.read_excel(path)

aggregated_df = df_101.groupby('收款账号')['金额'].sum().reset_index()

# ...拼接所有账单数据
bill_df = pd.DataFrame(data=bill_rows,
                        columns=['账户ID', '第三方账单收款', '第三方账单总金额', '第三方账单退款金额'])

# 减法核验,结果为 0 则无差异
# 合并账单 DataFrame 和汇总文件 DataFrame
# 类似 Excel 的 VLOOKUP
merged_df = pd.merge(aggregated_df, bill_df, on='账户ID', how='outer')
merged_df["核验"] = merged_df["金额"] - merged_df["第三方账单总金额"] + merged_df["第三方账单退款金额"]
print(merged_df["核验"])

Workflow