From 527d3b655a1fafc676f98b26e012c6140fd75048 Mon Sep 17 00:00:00 2001
From: 100gle <569590461@qq.com>
Date: Sat, 19 Nov 2022 11:21:53 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E6=8A=80=E8=83=BD?=
=?UTF-8?q?=E6=89=A9=E5=B1=95N6=E4=B8=80=E7=AB=A0=E7=9B=B8=E5=85=B3?=
=?UTF-8?q?=E7=A4=BA=E4=BE=8B=E6=BA=90=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
code/newsletter/N6/method_chaining.ipynb | 351 +++++++++++++++++++++++
1 file changed, 351 insertions(+)
create mode 100644 code/newsletter/N6/method_chaining.ipynb
diff --git a/code/newsletter/N6/method_chaining.ipynb b/code/newsletter/N6/method_chaining.ipynb
new file mode 100644
index 0000000..b98d209
--- /dev/null
+++ b/code/newsletter/N6/method_chaining.ipynb
@@ -0,0 +1,351 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "source": [
+ "# 链式调用示例"
+ ],
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%% md\n"
+ }
+ },
+ "outputs": []
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "outputs": [
+ {
+ "data": {
+ "text/plain": " date\n0 2022-01-02\n1 2022-01-09\n2 2022-01-16\n3 2022-01-23\n4 2022-01-30",
+ "text/html": "
\n\n
\n \n \n | \n date | \n
\n \n \n \n | 0 | \n 2022-01-02 | \n
\n \n | 1 | \n 2022-01-09 | \n
\n \n | 2 | \n 2022-01-16 | \n
\n \n | 3 | \n 2022-01-23 | \n
\n \n | 4 | \n 2022-01-30 | \n
\n \n
\n
"
+ },
+ "execution_count": 2,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "import pandas as pd\n",
+ "\n",
+ "data = pd.DataFrame(dict(date=pd.date_range(\"20220101\", \"20220201\", freq=\"1W\")))\n",
+ "data.head()"
+ ],
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "outputs": [
+ {
+ "data": {
+ "text/plain": " date year month day year_month\n0 2022-01-02 2022 01 02 202201\n1 2022-01-09 2022 01 09 202201\n2 2022-01-16 2022 01 16 202201\n3 2022-01-23 2022 01 23 202201\n4 2022-01-30 2022 01 30 202201",
+ "text/html": "\n\n
\n \n \n | \n date | \n year | \n month | \n day | \n year_month | \n
\n \n \n \n | 0 | \n 2022-01-02 | \n 2022 | \n 01 | \n 02 | \n 202201 | \n
\n \n | 1 | \n 2022-01-09 | \n 2022 | \n 01 | \n 09 | \n 202201 | \n
\n \n | 2 | \n 2022-01-16 | \n 2022 | \n 01 | \n 16 | \n 202201 | \n
\n \n | 3 | \n 2022-01-23 | \n 2022 | \n 01 | \n 23 | \n 202201 | \n
\n \n | 4 | \n 2022-01-30 | \n 2022 | \n 01 | \n 30 | \n 202201 | \n
\n \n
\n
"
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "data[\"date\"] = data[\"date\"].astype(str)\n",
+ "data[\"year\"] = data[\"date\"].map(lambda s: s.split(\"-\")[0])\n",
+ "data[\"month\"] = data[\"date\"].map(lambda s: s.split(\"-\")[1])\n",
+ "data[\"day\"] = data[\"date\"].map(lambda s: s.split(\"-\")[2])\n",
+ "data[\"year_month\"] = data[\"year\"].str.cat(data[\"month\"])\n",
+ "data.head()"
+ ],
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "## 第一种重构方式"
+ ],
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%% md\n"
+ }
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "data = (\n",
+ " pd.DataFrame({\"date\": pd.date_range(\"20220101\", \"20220201\", freq=\"1W\")})\n",
+ " .astype({\"date\": \"str\"})[\"date\"]\n",
+ " .str.split(\"-\", expand=True)\n",
+ " .rename(\n",
+ " columns={\n",
+ " 0: \"year\",\n",
+ " 1: \"month\",\n",
+ " 2: \"day\",\n",
+ " }\n",
+ " )\n",
+ " .assign(\n",
+ " date=lambda df: df.apply(lambda r: \"-\".join(r.tolist()), axis=1),\n",
+ " year_month=lambda df: df[\"year\"].str.cat(df[\"month\"]),\n",
+ " )\n",
+ ")\n",
+ "data.head()"
+ ],
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "execution_count": 4,
+ "outputs": [
+ {
+ "data": {
+ "text/plain": " year month day date year_month\n0 2022 01 02 2022-01-02 202201\n1 2022 01 09 2022-01-09 202201\n2 2022 01 16 2022-01-16 202201\n3 2022 01 23 2022-01-23 202201\n4 2022 01 30 2022-01-30 202201",
+ "text/html": "\n\n
\n \n \n | \n year | \n month | \n day | \n date | \n year_month | \n
\n \n \n \n | 0 | \n 2022 | \n 01 | \n 02 | \n 2022-01-02 | \n 202201 | \n
\n \n | 1 | \n 2022 | \n 01 | \n 09 | \n 2022-01-09 | \n 202201 | \n
\n \n | 2 | \n 2022 | \n 01 | \n 16 | \n 2022-01-16 | \n 202201 | \n
\n \n | 3 | \n 2022 | \n 01 | \n 23 | \n 2022-01-23 | \n 202201 | \n
\n \n | 4 | \n 2022 | \n 01 | \n 30 | \n 2022-01-30 | \n 202201 | \n
\n \n
\n
"
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "## 第二种重构方式"
+ ],
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%% md\n"
+ }
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "outputs": [
+ {
+ "data": {
+ "text/plain": " year month day date year_month\n0 2022 01 02 2022-01-02 202201\n1 2022 01 09 2022-01-09 202201\n2 2022 01 16 2022-01-16 202201\n3 2022 01 23 2022-01-23 202201\n4 2022 01 30 2022-01-30 202201",
+ "text/html": "\n\n
\n \n \n | \n year | \n month | \n day | \n date | \n year_month | \n
\n \n \n \n | 0 | \n 2022 | \n 01 | \n 02 | \n 2022-01-02 | \n 202201 | \n
\n \n | 1 | \n 2022 | \n 01 | \n 09 | \n 2022-01-09 | \n 202201 | \n
\n \n | 2 | \n 2022 | \n 01 | \n 16 | \n 2022-01-16 | \n 202201 | \n
\n \n | 3 | \n 2022 | \n 01 | \n 23 | \n 2022-01-23 | \n 202201 | \n
\n \n | 4 | \n 2022 | \n 01 | \n 30 | \n 2022-01-30 | \n 202201 | \n
\n \n
\n
"
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "data = (\n",
+ " pd.DataFrame({\"date\": pd.date_range(\"20220101\", \"20220201\", freq=\"1W\")})\n",
+ " .astype({\"date\": \"str\"})[\"date\"]\n",
+ " .str.extract(r\"(?P\\d{4})-(?P\\d{2})-(?P\\d{2})\")\n",
+ " .assign(\n",
+ " date=lambda df: df.apply(lambda row: \"-\".join(row.tolist()), axis=1),\n",
+ " year_month=lambda df: df[\"year\"].str.cat(df[\"month\"]),\n",
+ " )\n",
+ ")\n",
+ "\n",
+ "data.head()"
+ ],
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "## 第三种重构方式"
+ ],
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%% md\n"
+ }
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "outputs": [
+ {
+ "data": {
+ "text/plain": " date year month day year_month\n0 2022-01-02 2022 01 02 202201\n1 2022-01-09 2022 01 09 202201\n2 2022-01-16 2022 01 16 202201\n3 2022-01-23 2022 01 23 202201\n4 2022-01-30 2022 01 30 202201",
+ "text/html": "\n\n
\n \n \n | \n date | \n year | \n month | \n day | \n year_month | \n
\n \n \n \n | 0 | \n 2022-01-02 | \n 2022 | \n 01 | \n 02 | \n 202201 | \n
\n \n | 1 | \n 2022-01-09 | \n 2022 | \n 01 | \n 09 | \n 202201 | \n
\n \n | 2 | \n 2022-01-16 | \n 2022 | \n 01 | \n 16 | \n 202201 | \n
\n \n | 3 | \n 2022-01-23 | \n 2022 | \n 01 | \n 23 | \n 202201 | \n
\n \n | 4 | \n 2022-01-30 | \n 2022 | \n 01 | \n 30 | \n 202201 | \n
\n \n
\n
"
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "data = (\n",
+ " pd.DataFrame({\"date\": pd.date_range(\"20220101\", \"20220201\", freq=\"1W\")})\n",
+ " .assign(\n",
+ " year=lambda df: df[\"date\"].dt.year,\n",
+ " month=lambda df: df[\"date\"].dt.month.astype(str).str.zfill(2),\n",
+ " day=lambda df: df[\"date\"].dt.day.astype(str).str.zfill(2),\n",
+ " year_month=lambda df: df[\"date\"].dt.strftime(\"%Y%m\"),\n",
+ " )\n",
+ " .astype(str)\n",
+ ")\n",
+ "data.head()"
+ ],
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "# 链式调用的实现原理以及优劣"
+ ],
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%% md\n"
+ }
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "outputs": [],
+ "source": [
+ "class Command:\n",
+ " def __init__(self, name=None):\n",
+ " self.name = name\n",
+ "\n",
+ " def set_options(self, **kwargs):\n",
+ " for k, v in kwargs.items():\n",
+ " if not hasattr(self, k):\n",
+ " setattr(self, k, v)\n",
+ " return self\n",
+ "\n",
+ " def parse(self):\n",
+ " opts = [f\"{v}\" for k, v in self.__dict__.items() if k != \"name\"]\n",
+ " final = \" \".join([self.name, *opts])\n",
+ " return final\n",
+ "\n",
+ " def __repr__(self):\n",
+ " opts = [f\"{k}={v}\" for k, v in self.__dict__.items() if k != \"name\"]\n",
+ " return f\"Command\""
+ ],
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "outputs": [],
+ "source": [
+ "cmd = Command(\"curl\").set_options(verbose=\"-v\").set_options(target=\"sspai.com\")"
+ ],
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Command\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(cmd)"
+ ],
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "curl -v sspai.com\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(cmd.parse())"
+ ],
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "outputs": [],
+ "source": [],
+ "metadata": {
+ "collapsed": false,
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ }
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 2
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython2",
+ "version": "2.7.6"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}
\ No newline at end of file