{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "ExecuteTime": { "start_time": "2023-05-04T14:47:14.249433Z", "end_time": "2023-05-04T14:47:14.815684Z" } }, "outputs": [], "source": [ "import os\n", "\n", "from IPython.core.interactiveshell import InteractiveShell #执行该代码可以使得当前nb支持多输出\n", "InteractiveShell.ast_node_interactivity = \"all\" \n", "import numpy as np\n", "import pandas as pd \n", "pd.options.display.max_rows = 8 " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**作业**\n", "综合运用stack/unstack,pivot/melt" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "scrolled": true, "ExecuteTime": { "start_time": "2023-05-04T14:47:14.807387Z", "end_time": "2023-05-04T14:47:14.828436Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "item realgdp infl unemp\n", "date \n", "1959-03-31 2710.349 0.00 5.8\n", "1959-06-30 2778.801 2.34 5.1\n", "1959-09-30 2775.488 2.74 5.3\n", "1959-12-31 2785.204 0.27 5.6\n", "... ... ... ...\n", "2008-12-31 13141.920 -8.79 6.9\n", "2009-03-31 12925.410 0.94 8.1\n", "2009-06-30 12901.504 3.37 9.2\n", "2009-09-30 12990.341 3.56 9.6\n", "\n", "[203 rows x 3 columns]\n" ] } ], "source": [ "#有可能是版本问题,需要加入.strftime('%Y-%m-%d')\n", "data = pd.read_csv('../examples/macrodata.csv')\n", "data.index = pd.PeriodIndex(year=data.year, quarter=data.quarter,name='date').to_timestamp('D', 'end').strftime('%Y-%m-%d')\n", "data = data.reindex(columns=pd.Index(['realgdp', 'infl', 'unemp'], name='item'))\n", "print(data)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**作业1:**\n", "data通过stack/melt获得ldata" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "scrolled": true, "ExecuteTime": { "start_time": "2023-05-04T14:47:17.592602Z", "end_time": "2023-05-04T14:47:17.608357Z" } }, "outputs": [ { "data": { "text/plain": " date item value\n0 1959-03-31 realgdp 2710.349\n1 1959-03-31 infl 0.000\n2 1959-03-31 unemp 5.800\n3 1959-06-30 realgdp 2778.801\n4 1959-06-30 infl 2.340", "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
dateitemvalue
01959-03-31realgdp2710.349
11959-03-31infl0.000
21959-03-31unemp5.800
31959-06-30realgdp2778.801
41959-06-30infl2.340
\n
" }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": " date item value\n0 1959-03-31 realgdp 2710.349\n1 1959-03-31 infl 0.000\n2 1959-03-31 unemp 5.800\n3 1959-06-30 realgdp 2778.801\n4 1959-06-30 infl 2.340", "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
dateitemvalue
01959-03-31realgdp2710.349
11959-03-31infl0.000
21959-03-31unemp5.800
31959-06-30realgdp2778.801
41959-06-30infl2.340
\n
" }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#请输入data使用stack实现的代码(不得使用melt)\n", "data = data.reset_index()\n", "\n", "ldata= data.set_index('date').stack().reset_index()\n", "ldata.columns = ['date', 'item', 'value']\n", "ldata.head()\n", "\n", "# 请输出data使用melt实现的代码(不得使用stack)\n", "#data = data.reset_index()\n", "#ldata = pd.melt(data, id_vars=['date'], value_vars=['realgdp', 'infl', 'unemp'], var_name='item', value_name='value')\n", "ldata.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**作业2**\n", "\n", "ldata通过pivot/unstack恢复data" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "scrolled": true, "ExecuteTime": { "start_time": "2023-05-04T00:56:26.823785Z", "end_time": "2023-05-04T00:56:26.852233Z" } }, "outputs": [ { "data": { "text/plain": " infl realgdp unemp\ndate \n1959-03-31 0.00 2710.349 5.8\n1959-06-30 2.34 2778.801 5.1\n1959-09-30 2.74 2775.488 5.3\n1959-12-31 0.27 2785.204 5.6\n1960-03-31 2.31 2847.699 5.2", "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
inflrealgdpunemp
date
1959-03-310.002710.3495.8
1959-06-302.342778.8015.1
1959-09-302.742775.4885.3
1959-12-310.272785.2045.6
1960-03-312.312847.6995.2
\n
" }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#请输入ldata使用pivot实现的代码(不得使用unstack)\n", "#pivoted = ldata.pivot(index='date', columns='item', values='value')\n", "#pivoted.head() #同data.head()\n", "\n", "#请输入ldata使用unstack实现的代码(不得使用pivot)\n", "# 将date列转换为索引,并将item列转换为列标签\n", "pivoted = ldata.set_index(['date', 'item'])['value'].unstack()\n", "# 重命名列标签级别的名称\n", "pivoted.columns.name = None\n", "\n", "pivoted.head() #同data.head() " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**作业3:**\n", "\n", "参照“经营数据分析.xlsx”,求解下列问题,使得输出与结果相同" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "ExecuteTime": { "start_time": "2023-05-04T15:44:58.159977Z", "end_time": "2023-05-04T15:44:58.196601Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 方案 设备投资 单件成本 年销售量 销售单价 年收益\n", "0 方案1 1500000 1700 8000 2900 8100000\n", "1 方案2 2000000 1550 8000 2900 8800000\n", "2 方案3 2500000 1400 8000 2900 9500000\n", "年收益最高的方案是: 方案3\n", " 方案 设备投资 单件成本 年销售量 销售单价 年收益 差值\n", "0 方案1 1500000 1700 8000 2900 8100000 1960000090000\n", "1 方案2 2000000 1550 8000 2900 8800000 740000022500\n", "2 方案3 2500000 1400 8000 2900 9500000 1000000000000\n", "差值最小的方案是: 方案2\n" ] }, { "data": { "text/plain": " 畅销 一般 滞销\n方案 \n方案1 12900000 8100000 300000\n方案2 14200000 8800000 25000\n方案3 15500000 9500000 -250000", "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
畅销一般滞销
方案
方案1129000008100000300000
方案214200000880000025000
方案3155000009500000-250000
\n
" }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" }, { "name": "stdout", "output_type": "stream", "text": [ " 畅销 一般 滞销\n", "0 12900000 8100000 300000\n", "1 14200000 8800000 25000\n", "2 15500000 9500000 -250000\n" ] }, { "data": { "text/plain": " 畅销 一般 滞销 折中\n方案 \n方案1 12900000 8100000 300000 8490000.0\n方案2 14200000 8800000 25000 9238750.0\n方案3 15500000 9500000 -250000 9987500.0", "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
畅销一般滞销折中
方案
方案11290000081000003000008490000.0
方案2142000008800000250009238750.0
方案3155000009500000-2500009987500.0
\n
" }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" }, { "name": "stdout", "output_type": "stream", "text": [ " 畅销 一般 滞销 折中\n", "0 12900000 8100000 300000 8490000.0\n", "1 14200000 8800000 25000 9238750.0\n", "2 15500000 9500000 -250000 9987500.0\n", "折中方案最佳方案是: 方案3\n" ] }, { "data": { "text/plain": " 畅销 一般 滞销 期望\n方案 \n方案1 12900000 8100000 300000 6630000.0\n方案2 14200000 8800000 25000 7146250.0\n方案3 15500000 9500000 -250000 7662500.0", "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
畅销一般滞销期望
方案
方案11290000081000003000006630000.0
方案2142000008800000250007146250.0
方案3155000009500000-2500007662500.0
\n
" }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" }, { "name": "stdout", "output_type": "stream", "text": [ " 畅销 一般 滞销 期望\n", "0 12900000 8100000 300000 6630000.0\n", "1 14200000 8800000 25000 7146250.0\n", "2 15500000 9500000 -250000 7662500.0\n", "期望值最佳方案是: 方案3\n" ] } ], "source": [ "## 单目标求解\n", "# 年收益=年销售量*(销售单价-单件成本)-设备投资\n", "# 求年收益最佳方案?\n", "df = pd.read_excel(\"../examples/经营数据分析.xlsx\")\n", "# 计算年收益\n", "df['年收益'] = df['年销售量'] * (df['销售单价'] - df['单件成本']) - df['设备投资']\n", "# 按照年收益找最大值,取方案列\n", "best_plan = df.loc[df['年收益'].idxmax(), '方案']\n", "print(df)\n", "print('年收益最高的方案是:', best_plan)\n", "\n", "\n", "#\n", "# ## 多目标求解 ----\n", "# 期望值=[min(设备投资),min(单件成本),max(年销售量),max(销售单价),\n", "# max(年收益)];\n", "# 差值=每个方案中,各项数据与期望值的之差的平方和\n", "# 求差值最佳方案?\n", "df = pd.read_excel(\"../examples/经营数据分析.xlsx\")\n", "# 计算年收益\n", "df['年收益'] = df['年销售量'] * (df['销售单价'] - df['单件成本']) - df['设备投资']\n", "# 计算期望值\n", "expected_values = [df['设备投资'].min(), df['单件成本'].min(), df['年销售量'].max(), df['销售单价'].max(), df['年收益'].max()]\n", "# 转换为Series以匹配 df\n", "expected_values = pd.Series(expected_values, index=df.columns[1:])\n", "# 计算差值\n", "df['差值'] = np.sum((df - expected_values) ** 2, axis=1)\n", "# 选择差值最小的方案\n", "best_plan = df.loc[df['差值'].idxmin(), '方案']\n", "# 禁用科学计数法打印\n", "pd.set_option('float_format','{:.0f}'.format)\n", "print(df)\n", "print('差值最小的方案是:', best_plan)\n", "\n", "\n", "# 不确定性决策分析 ----\n", "## 分析方法\n", "# PLm=pd.DataFrame();# 损益矩阵 ProfitLoss matrix\n", "# PLm['畅销']= 12000*(销售单价-单件成本)-设备投资;\n", "# PLm['一般']= 8000*(销售单价-单件成本)-设备投资;\n", "# PLm['滞销']= 1500*(销售单价-单件成本)-设备投资;\n", "# #\n", "# ## 分析原则----\n", "# # 乐观原则\n", "# lg=损益矩阵三种情况的最大值\n", "#\n", "# # 悲观原则\n", "# bg=损益矩阵三种情况的最小值\n", "#\n", "# # 折中原则\n", "# a=0.65 #65%的乐观概率\n", "# 折中方案= a*lg + (1-a)*bg;\n", "# 求折中最佳方案?\n", "df = pd.read_excel(\"../examples/经营数据分析.xlsx\")\n", "# 计算损益矩阵\n", "PLm = pd.DataFrame()\n", "PLm['畅销'] = 12000 * (df['销售单价'] - df['单件成本']) - df['设备投资']\n", "PLm['一般'] = 8000 * (df['销售单价'] - df['单件成本']) - df['设备投资']\n", "PLm['滞销'] = 1500 * (df['销售单价'] - df['单件成本']) - df['设备投资']\n", "PLm.set_index(df['方案'])\n", "print(PLm)\n", "pd.set_option('float_format', '{:.1f}'.format)\n", "# 计算乐观、悲观和折中方案\n", "mids = []\n", "a = 0.65\n", "for index, row in PLm.iterrows():\n", " mids.append(row.max() * a + (1-a) * row.min())\n", "PLm['折中'] = mids\n", "PLm.set_index(df['方案'])\n", "print(PLm)\n", "best_plan = df.loc[PLm['折中'].idxmax(), '方案']\n", "print('折中方案最佳方案是:',best_plan)\n", "\n", "# # 概率性决策分析 ----\n", "## 期望值法 ----\n", "probE=[0.1,0.65,0.25]; #畅销、一般、滞销的概率\n", "# 期望值=损益矩阵*probE\n", "# 求期望值最佳方案?\n", "df = pd.read_excel(\"../examples/经营数据分析.xlsx\")\n", "# 刷新PLm\n", "PLm = pd.DataFrame()\n", "PLm['畅销'] = 12000 * (df['销售单价'] - df['单件成本']) - df['设备投资']\n", "PLm['一般'] = 8000 * (df['销售单价'] - df['单件成本']) - df['设备投资']\n", "PLm['滞销'] = 1500 * (df['销售单价'] - df['单件成本']) - df['设备投资']\n", "\n", "# 利用numpy的dot乘法求出期望值\n", "expected_values = np.dot(PLm, probE)\n", "PLm['期望'] = expected_values\n", "PLm.set_index(df['方案'])\n", "\n", "# 设为保留一位小数\n", "print(PLm)\n", "best_plan = df.loc[PLm['期望'].idxmax(), '方案']\n", "print('期望值最佳方案是:',best_plan)\n" ] } ], "metadata": { "hide_input": false, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": true, "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 1 }