feat: 新增技能扩展N6一章相关示例源码
This commit is contained in:
351
code/newsletter/N6/method_chaining.ipynb
Normal file
351
code/newsletter/N6/method_chaining.ipynb
Normal file
@@ -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": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>date</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>2022-01-02</td>\n </tr>\n <tr>\n <th>1</th>\n <td>2022-01-09</td>\n </tr>\n <tr>\n <th>2</th>\n <td>2022-01-16</td>\n </tr>\n <tr>\n <th>3</th>\n <td>2022-01-23</td>\n </tr>\n <tr>\n <th>4</th>\n <td>2022-01-30</td>\n </tr>\n </tbody>\n</table>\n</div>"
|
||||
},
|
||||
"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": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>date</th>\n <th>year</th>\n <th>month</th>\n <th>day</th>\n <th>year_month</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>2022-01-02</td>\n <td>2022</td>\n <td>01</td>\n <td>02</td>\n <td>202201</td>\n </tr>\n <tr>\n <th>1</th>\n <td>2022-01-09</td>\n <td>2022</td>\n <td>01</td>\n <td>09</td>\n <td>202201</td>\n </tr>\n <tr>\n <th>2</th>\n <td>2022-01-16</td>\n <td>2022</td>\n <td>01</td>\n <td>16</td>\n <td>202201</td>\n </tr>\n <tr>\n <th>3</th>\n <td>2022-01-23</td>\n <td>2022</td>\n <td>01</td>\n <td>23</td>\n <td>202201</td>\n </tr>\n <tr>\n <th>4</th>\n <td>2022-01-30</td>\n <td>2022</td>\n <td>01</td>\n <td>30</td>\n <td>202201</td>\n </tr>\n </tbody>\n</table>\n</div>"
|
||||
},
|
||||
"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": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>year</th>\n <th>month</th>\n <th>day</th>\n <th>date</th>\n <th>year_month</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>2022</td>\n <td>01</td>\n <td>02</td>\n <td>2022-01-02</td>\n <td>202201</td>\n </tr>\n <tr>\n <th>1</th>\n <td>2022</td>\n <td>01</td>\n <td>09</td>\n <td>2022-01-09</td>\n <td>202201</td>\n </tr>\n <tr>\n <th>2</th>\n <td>2022</td>\n <td>01</td>\n <td>16</td>\n <td>2022-01-16</td>\n <td>202201</td>\n </tr>\n <tr>\n <th>3</th>\n <td>2022</td>\n <td>01</td>\n <td>23</td>\n <td>2022-01-23</td>\n <td>202201</td>\n </tr>\n <tr>\n <th>4</th>\n <td>2022</td>\n <td>01</td>\n <td>30</td>\n <td>2022-01-30</td>\n <td>202201</td>\n </tr>\n </tbody>\n</table>\n</div>"
|
||||
},
|
||||
"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": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>year</th>\n <th>month</th>\n <th>day</th>\n <th>date</th>\n <th>year_month</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>2022</td>\n <td>01</td>\n <td>02</td>\n <td>2022-01-02</td>\n <td>202201</td>\n </tr>\n <tr>\n <th>1</th>\n <td>2022</td>\n <td>01</td>\n <td>09</td>\n <td>2022-01-09</td>\n <td>202201</td>\n </tr>\n <tr>\n <th>2</th>\n <td>2022</td>\n <td>01</td>\n <td>16</td>\n <td>2022-01-16</td>\n <td>202201</td>\n </tr>\n <tr>\n <th>3</th>\n <td>2022</td>\n <td>01</td>\n <td>23</td>\n <td>2022-01-23</td>\n <td>202201</td>\n </tr>\n <tr>\n <th>4</th>\n <td>2022</td>\n <td>01</td>\n <td>30</td>\n <td>2022-01-30</td>\n <td>202201</td>\n </tr>\n </tbody>\n</table>\n</div>"
|
||||
},
|
||||
"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<year>\\d{4})-(?P<month>\\d{2})-(?P<day>\\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": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>date</th>\n <th>year</th>\n <th>month</th>\n <th>day</th>\n <th>year_month</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>2022-01-02</td>\n <td>2022</td>\n <td>01</td>\n <td>02</td>\n <td>202201</td>\n </tr>\n <tr>\n <th>1</th>\n <td>2022-01-09</td>\n <td>2022</td>\n <td>01</td>\n <td>09</td>\n <td>202201</td>\n </tr>\n <tr>\n <th>2</th>\n <td>2022-01-16</td>\n <td>2022</td>\n <td>01</td>\n <td>16</td>\n <td>202201</td>\n </tr>\n <tr>\n <th>3</th>\n <td>2022-01-23</td>\n <td>2022</td>\n <td>01</td>\n <td>23</td>\n <td>202201</td>\n </tr>\n <tr>\n <th>4</th>\n <td>2022-01-30</td>\n <td>2022</td>\n <td>01</td>\n <td>30</td>\n <td>202201</td>\n </tr>\n </tbody>\n</table>\n</div>"
|
||||
},
|
||||
"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<name: {self.name}, options[{', '.join(opts)}]>\""
|
||||
],
|
||||
"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<name: curl, options[verbose=-v, target=sspai.com]>\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
|
||||
}
|
||||
Reference in New Issue
Block a user