{ "cells": [ { "cell_type": "code", "execution_count": 13, "id": "9daadf20-caa6-4b25-901c-6cc3ef563f58", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(255, 28)\n", "(78, 4)\n", "(255, 31)\n", " ds NHITS Informer LSTM iTransformer TSMixer \\\n", "0 2024-10-08 79.76823 80.197660 79.802414 78.391460 80.200510 \n", "1 2024-10-09 78.75903 80.235740 79.844154 78.888565 79.861180 \n", "2 2024-10-10 79.43970 80.186230 79.885100 79.488700 79.483086 \n", "3 2024-10-11 79.62268 80.502975 79.878560 79.406670 79.313965 \n", "4 2024-10-14 79.91698 80.931946 79.936270 79.758575 79.197430 \n", "\n", " TSMixerx PatchTST RNN GRU ... y \\\n", "0 79.243256 80.883450 80.836105 81.276060 ... 77.180000 \n", "1 78.068150 80.950096 80.917860 81.303505 ... 76.580002 \n", "2 77.189064 80.347400 80.866040 81.798050 ... 79.400002 \n", "3 77.840096 80.545296 81.167710 81.552810 ... 79.040001 \n", "4 77.904300 81.432976 81.144210 81.483215 ... 77.459999 \n", "\n", " min_within_quantile max_within_quantile id CREAT_DATE min_price \\\n", "0 80.200510 81.163630 51 2024-10-07 79.848624 \n", "1 79.861180 81.757850 52 2024-10-07 79.981211 \n", "2 79.483086 81.190400 53 2024-10-07 79.398409 \n", "3 79.313965 81.371100 54 2024-10-07 79.394607 \n", "4 79.197430 81.432976 55 2024-10-07 79.351007 \n", "\n", " max_price 序号 LOW_PRICE HIGH_PRICE \n", "0 81.848624 52.0 76.36 81.14 \n", "1 81.981211 51.0 75.15 78.02 \n", "2 81.398409 50.0 76.72 79.72 \n", "3 81.394607 49.0 78.04 79.50 \n", "4 81.351007 48.0 74.86 78.55 \n", "\n", "[5 rows x 31 columns]\n", " ds NHITS Informer LSTM iTransformer TSMixer \\\n", "250 2024-12-16 74.268654 73.333750 73.090164 74.007034 74.36094 \n", "251 2024-12-17 74.724630 73.373810 73.242540 74.285530 74.24597 \n", "252 2024-12-18 74.948860 73.505330 73.400400 74.260290 74.06419 \n", "253 2024-12-19 74.396740 73.934380 73.764320 74.429800 74.18059 \n", "254 2024-12-20 73.882930 73.700935 73.769050 73.977585 73.97370 \n", "\n", " TSMixerx PatchTST RNN GRU ... y min_within_quantile \\\n", "250 74.67781 74.475680 75.63023 74.853800 ... NaN 74.157196 \n", "251 74.46460 74.628000 75.22519 74.957530 ... NaN 73.711680 \n", "252 74.32628 74.656815 75.49716 74.890236 ... NaN 74.064190 \n", "253 74.41026 74.698875 75.87007 75.118866 ... NaN 74.148070 \n", "254 74.49235 74.345410 75.88466 75.186325 ... NaN 73.816990 \n", "\n", " max_within_quantile id CREAT_DATE min_price max_price 序号 \\\n", "250 74.576454 301 2024-12-16 73.416857 75.416857 3.0 \n", "251 74.948060 302 2024-12-16 73.434301 75.434301 2.0 \n", "252 75.200980 303 2024-12-16 73.707471 75.707471 1.0 \n", "253 75.395440 304 2024-12-16 73.639791 75.639791 NaN \n", "254 74.345410 305 2024-12-16 73.067399 75.067399 NaN \n", "\n", " LOW_PRICE HIGH_PRICE \n", "250 72.53 73.28 \n", "251 72.48 74.18 \n", "252 72.80 74.20 \n", "253 NaN NaN \n", "254 NaN NaN \n", "\n", "[5 rows x 31 columns]\n" ] } ], "source": [ "import sqlite3\n", "import os\n", "import pandas as pd\n", "\n", "dataset = r'yuanyoudataset'\n", "\n", "# dataset = r'C:\\Users\\Administrator\\Desktop' \n", "\n", "# 预测价格数据\n", "# dbfilename = os.path.join(r'D:\\code\\PriceForecast\\yuanyoudataset','jbsh_yuanyou.db')\n", "# conn = sqlite3.connect(dbfilename)\n", "# query = 'SELECT * FROM accuracy'\n", "# df1 = pd.read_sql_query(query, conn)\n", "# df1['ds'] = df1['PREDICT_DATE']\n", "# conn.close()\n", "# print(df1.shape)\n", "\n", "# 预测价格数据\n", "dfcsvfilename = os.path.join(dataset,'accuracy_five_mean.csv')\n", "df1 = pd.read_csv(dfcsvfilename)\n", "print(df1.shape)\n", "\n", "# 最高最低价\n", "xlsfilename = os.path.join(dataset,'数据项下载.xls')\n", "df2 = pd.read_excel(xlsfilename)[5:]\n", "df2 = df2.rename(columns = {'数据项名称':'ds','布伦特最低价':'LOW_PRICE','布伦特最高价':'HIGH_PRICE'})\n", "print(df2.shape)\n", "\n", "\n", "\n", "df = pd.merge(df1,df2,on=['ds'],how='left')\n", "\n", "df['ds'] = pd.to_datetime(df['ds'])\n", "# df['PREDICT_DATE'] = pd.to_datetime(df['PREDICT_DATE'])\n", "df = df.reindex()\n", "\n", "print(df.shape)\n", "# from datetime import datetime\n", "import time\n", "df.to_csv(os.path.join(dataset,f'预测数据-{time.time()}.csv'))\n", "# df = df[['ds','min_within_quantile','max_within_quantile']]\n", "\n", "\n", "\n", "# 打印数据框的前几行\n", "print(df.head())\n", "print(df.tail())\n" ] }, { "cell_type": "code", "execution_count": 14, "id": "0d77ab7d", "metadata": {}, "outputs": [], "source": [ "# 模型评估前五均值 \n", "df['min_price'] = df.iloc[:,1:6].mean(axis=1) -1.5\n", "df['max_price'] = df.iloc[:,1:6].mean(axis=1) +1.5" ] }, { "cell_type": "code", "execution_count": 15, "id": "e51c3fd0-6bff-45de-b8b6-971e7986c7a7", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 开始日期 结束日期 准确率\n", "0 2024-09-27 2024-10-04 0\n", " 开始日期 结束日期 准确率\n", "0 2024-09-27 2024-10-04 0\n", " 开始日期 结束日期 准确率\n", "0 2024-09-27 2024-10-04 0\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " 开始日期 结束日期 准确率\n", "0 2024-09-27 2024-10-04 0\n", " 开始日期 结束日期 准确率\n", "0 2024-09-27 2024-10-04 0\n", " 开始日期 结束日期 准确率\n", "0 2024-10-04 2024-10-11 0.433988\n", " 开始日期 结束日期 准确率\n", "0 2024-10-04 2024-10-11 0.433988\n", " 开始日期 结束日期 准确率\n", "0 2024-10-04 2024-10-11 0.433988\n", " 开始日期 结束日期 准确率\n", "0 2024-10-04 2024-10-11 0.433988\n", " 开始日期 结束日期 准确率\n", "0 2024-10-04 2024-10-11 0.433988\n", " 开始日期 结束日期 准确率\n", "0 2024-10-11 2024-10-18 0.367557\n", " 开始日期 结束日期 准确率\n", "0 2024-10-11 2024-10-18 0.367557\n", " 开始日期 结束日期 准确率\n", "0 2024-10-11 2024-10-18 0.367557\n", " 开始日期 结束日期 准确率\n", "0 2024-10-11 2024-10-18 0.367557\n", " 开始日期 结束日期 准确率\n", "0 2024-10-11 2024-10-18 0.367557\n", " 开始日期 结束日期 准确率\n", "0 2024-10-18 2024-10-25 0.342808\n", " 开始日期 结束日期 准确率\n", "0 2024-10-18 2024-10-25 0.342808\n", " 开始日期 结束日期 准确率\n", "0 2024-10-18 2024-10-25 0.342808\n", " 开始日期 结束日期 准确率\n", "0 2024-10-18 2024-10-25 0.342808\n", " 开始日期 结束日期 准确率\n", "0 2024-10-18 2024-10-25 0.342808\n", " 开始日期 结束日期 准确率\n", "0 2024-10-25 2024-11-01 0.397058\n", " 开始日期 结束日期 准确率\n", "0 2024-10-25 2024-11-01 0.397058\n", " 开始日期 结束日期 准确率\n", "0 2024-10-25 2024-11-01 0.397058\n", " 开始日期 结束日期 准确率\n", "0 2024-10-25 2024-11-01 0.397058\n", " 开始日期 结束日期 准确率\n", "0 2024-10-25 2024-11-01 0.397058\n", " 开始日期 结束日期 准确率\n", "0 2024-11-01 2024-11-08 0.666605\n", " 开始日期 结束日期 准确率\n", "0 2024-11-01 2024-11-08 0.666605\n", " 开始日期 结束日期 准确率\n", "0 2024-11-01 2024-11-08 0.666605\n", " 开始日期 结束日期 准确率\n", "0 2024-11-01 2024-11-08 0.666605\n", " 开始日期 结束日期 准确率\n", "0 2024-11-01 2024-11-08 0.666605\n", " 开始日期 结束日期 准确率\n", "0 2024-11-08 2024-11-15 0.805488\n", " 开始日期 结束日期 准确率\n", "0 2024-11-08 2024-11-15 0.805488\n", " 开始日期 结束日期 准确率\n", "0 2024-11-08 2024-11-15 0.805488\n", " 开始日期 结束日期 准确率\n", "0 2024-11-08 2024-11-15 0.805488\n", " 开始日期 结束日期 准确率\n", "0 2024-11-08 2024-11-15 0.805488\n", " 开始日期 结束日期 准确率\n", "0 2024-11-15 2024-11-22 0.744558\n", " 开始日期 结束日期 准确率\n", "0 2024-11-15 2024-11-22 0.744558\n", " 开始日期 结束日期 准确率\n", "0 2024-11-15 2024-11-22 0.744558\n", " 开始日期 结束日期 准确率\n", "0 2024-11-15 2024-11-22 0.744558\n", " 开始日期 结束日期 准确率\n", "0 2024-11-15 2024-11-22 0.744558\n", " 开始日期 结束日期 准确率\n", "0 2024-11-22 2024-11-29 0.351228\n", " 开始日期 结束日期 准确率\n", "0 2024-11-22 2024-11-29 0.351228\n", " 开始日期 结束日期 准确率\n", "0 2024-11-22 2024-11-29 0.351228\n", " 开始日期 结束日期 准确率\n", "0 2024-11-22 2024-11-29 0.351228\n", " 开始日期 结束日期 准确率\n", "0 2024-11-22 2024-11-29 0.351228\n", " 开始日期 结束日期 准确率\n", "0 2024-11-29 2024-12-06 0.727334\n", " 开始日期 结束日期 准确率\n", "0 2024-11-29 2024-12-06 0.727334\n", " 开始日期 结束日期 准确率\n", "0 2024-11-29 2024-12-06 0.727334\n", " 开始日期 结束日期 准确率\n", "0 2024-11-29 2024-12-06 0.727334\n", " 开始日期 结束日期 准确率\n", "0 2024-11-29 2024-12-06 0.727334\n", " 开始日期 结束日期 准确率\n", "0 2024-12-06 2024-12-13 0.835391\n" ] } ], "source": [ "# 定义一个函数来计算准确率\n", "# 比较真实最高最低,和预测最高最低 计算准确率\n", "def calculate_accuracy(row):\n", " # 全子集情况:\n", " if (row['max_price'] >= row['HIGH_PRICE'] and row['min_price'] <= row['LOW_PRICE']) or \\\n", " (row['max_price'] <= row['HIGH_PRICE'] and row['min_price'] >= row['LOW_PRICE']):\n", " return 1 \n", " # 无交集情况:\n", " if row['max_price'] < row['LOW_PRICE'] or \\\n", " row['min_price'] > row['HIGH_PRICE']:\n", " return 0\n", " # 有交集情况:\n", " else:\n", " sorted_prices = sorted([row['LOW_PRICE'], row['min_price'], row['max_price'], row['HIGH_PRICE']])\n", " middle_diff = sorted_prices[2] - sorted_prices[1]\n", " price_range = row['HIGH_PRICE'] - row['LOW_PRICE']\n", " accuracy = middle_diff / price_range\n", " return accuracy\n", "import datetime\n", "weight_dict = [0.4,0.15,0.1,0.1,0.25] # 权重\n", "\n", "columns = ['HIGH_PRICE','LOW_PRICE','min_price','max_price']\n", "df[columns] = df[columns].astype(float)\n", "df['ACCURACY'] = df.apply(calculate_accuracy, axis=1)\n", "# df['ACCURACY'] = df.apply(is_within_range, axis=1)\n", "# 取结束日期上一周的日期\n", "def get_week_date(end_time):\n", " endtime = end_time\n", " endtimeweek = datetime.datetime.strptime(endtime, '%Y-%m-%d')\n", " up_week = endtimeweek - datetime.timedelta(days=endtimeweek.weekday() + 14)\n", " up_week_dates = [up_week + datetime.timedelta(days=i) for i in range(14)][4:-2]\n", " up_week_dates = [date.strftime('%Y-%m-%d') for date in up_week_dates]\n", " return up_week_dates\n", "\n", "# 计算准确率并保存结果\n", "def _get_accuracy_rate(df,up_week_dates,endtime):\n", " df3 = df.copy()\n", " df3 = df3[df3['CREAT_DATE'].isin(up_week_dates)]\n", " df3 = df3[df3['ds'].isin(up_week_dates)]\n", " accuracy_rote = 0\n", " for i,group in df3.groupby('ds'):\n", " # print('权重:',weight_dict[len(group)-1])\n", " # print('准确率:',(group['ACCURACY'].sum()/len(group))*weight_dict[len(group)-1])\n", " accuracy_rote += (group['ACCURACY'].sum()/len(group))*weight_dict[len(group)-1]\n", " df3.to_csv(os.path.join(dataset,f'accuracy_{endtime}.csv'),index=False)\n", " df4 = pd.DataFrame(columns=['开始日期','结束日期','准确率'])\n", " df4.loc[len(df4)] = {'开始日期':up_week_dates[0],'结束日期':up_week_dates[-1],'准确率':accuracy_rote}\n", " df4.to_csv(os.path.join(dataset,f'accuracy_rote_{endtime}.csv'),index=False)\n", " print(df4)\n", " # df4.to_sql(\"accuracy_rote\", con=sqlitedb.connection, if_exists='append', index=False)\n", "\n", "\n", "end_times = df['CREAT_DATE'].unique()\n", "for endtime in end_times:\n", " up_week_dates = get_week_date(endtime)\n", " _get_accuracy_rate(df,up_week_dates,endtime)\n", "\n", "# 打印结果\n", "\n" ] }, { "cell_type": "code", "execution_count": 31, "id": "0f942c69", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(255, 6)\n", " ds min_price max_price LOW_PRICE LOW_PRICE CREAT_DATE\n", "0 2024-10-08 78.172055 81.172055 76.36 76.36 2024-10-07\n", "1 2024-10-09 78.017734 81.017734 75.15 75.15 2024-10-07\n", "2 2024-10-10 78.196563 81.196563 76.72 76.72 2024-10-07\n", "3 2024-10-11 78.244970 81.244970 78.04 78.04 2024-10-07\n", "4 2024-10-14 78.448240 81.448240 74.86 74.86 2024-10-07\n", "5 2024-10-09 75.442758 78.442758 75.15 75.15 2024-10-08\n", "6 2024-10-10 75.684414 78.684414 76.72 76.72 2024-10-08\n", "7 2024-10-11 75.675482 78.675482 78.04 78.04 2024-10-08\n", "8 2024-10-14 75.819379 78.819379 74.86 74.86 2024-10-08\n", "9 2024-10-15 75.830953 78.830953 73.34 73.34 2024-10-08\n", "['2024-10-07', '2024-10-08', '2024-10-09', '2024-10-10', '2024-10-11', '2024-10-12', '2024-10-13']\n", "(10, 6)\n", " ds min_price max_price LOW_PRICE LOW_PRICE CREAT_DATE\n", "0 2024-10-08 78.172055 81.172055 76.36 76.36 2024-10-07\n", "1 2024-10-09 78.017734 81.017734 75.15 75.15 2024-10-07\n", "2 2024-10-10 78.196563 81.196563 76.72 76.72 2024-10-07\n", "3 2024-10-11 78.244970 81.244970 78.04 78.04 2024-10-07\n", "5 2024-10-09 75.442758 78.442758 75.15 75.15 2024-10-08\n", "6 2024-10-10 75.684414 78.684414 76.72 76.72 2024-10-08\n", "7 2024-10-11 75.675482 78.675482 78.04 78.04 2024-10-08\n", "10 2024-10-10 75.439643 78.439643 76.72 76.72 2024-10-09\n", "11 2024-10-11 75.214194 78.214194 78.04 78.04 2024-10-09\n", "15 2024-10-11 77.558740 80.558740 78.04 78.04 2024-10-10\n" ] }, { "ename": "ValueError", "evalue": "Per-column arrays must each be 1-dimensional", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)", "Cell \u001b[1;32mIn[31], line 33\u001b[0m\n\u001b[0;32m 31\u001b[0m sns\u001b[38;5;241m.\u001b[39mscatterplot(x\u001b[38;5;241m=\u001b[39mdf6\u001b[38;5;241m.\u001b[39mindex,y\u001b[38;5;241m=\u001b[39mdf6[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmin_price\u001b[39m\u001b[38;5;124m'\u001b[39m]\u001b[38;5;241m.\u001b[39mvalues,data\u001b[38;5;241m=\u001b[39mdf6)\n\u001b[0;32m 32\u001b[0m sns\u001b[38;5;241m.\u001b[39mscatterplot(x\u001b[38;5;241m=\u001b[39mdf6\u001b[38;5;241m.\u001b[39mindex,y\u001b[38;5;241m=\u001b[39mdf6[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmax_price\u001b[39m\u001b[38;5;124m'\u001b[39m]\u001b[38;5;241m.\u001b[39mvalues,data\u001b[38;5;241m=\u001b[39mdf6)\n\u001b[1;32m---> 33\u001b[0m sns\u001b[38;5;241m.\u001b[39mscatterplot(x\u001b[38;5;241m=\u001b[39mdf6\u001b[38;5;241m.\u001b[39mindex,y\u001b[38;5;241m=\u001b[39mdf6[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mLOW_PRICE\u001b[39m\u001b[38;5;124m'\u001b[39m]\u001b[38;5;241m.\u001b[39mvalues,data\u001b[38;5;241m=\u001b[39mdf6)\n\u001b[0;32m 34\u001b[0m sns\u001b[38;5;241m.\u001b[39mscatterplot(x\u001b[38;5;241m=\u001b[39mdf6\u001b[38;5;241m.\u001b[39mindex,y\u001b[38;5;241m=\u001b[39mdf6[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mHIGH_PRICE\u001b[39m\u001b[38;5;124m'\u001b[39m]\u001b[38;5;241m.\u001b[39mvalues,data\u001b[38;5;241m=\u001b[39mdf6)\n", "File \u001b[1;32md:\\ProgramData\\anaconda3\\Lib\\site-packages\\seaborn\\relational.py:742\u001b[0m, in \u001b[0;36mscatterplot\u001b[1;34m(data, x, y, hue, size, style, palette, hue_order, hue_norm, sizes, size_order, size_norm, markers, style_order, legend, ax, **kwargs)\u001b[0m\n\u001b[0;32m 732\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mscatterplot\u001b[39m(\n\u001b[0;32m 733\u001b[0m data\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m, \u001b[38;5;241m*\u001b[39m,\n\u001b[0;32m 734\u001b[0m x\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m, y\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m, hue\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m, size\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m, style\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 738\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs\n\u001b[0;32m 739\u001b[0m ):\n\u001b[0;32m 741\u001b[0m variables \u001b[38;5;241m=\u001b[39m _ScatterPlotter\u001b[38;5;241m.\u001b[39mget_semantics(\u001b[38;5;28mlocals\u001b[39m())\n\u001b[1;32m--> 742\u001b[0m p \u001b[38;5;241m=\u001b[39m _ScatterPlotter(data\u001b[38;5;241m=\u001b[39mdata, variables\u001b[38;5;241m=\u001b[39mvariables, legend\u001b[38;5;241m=\u001b[39mlegend)\n\u001b[0;32m 744\u001b[0m p\u001b[38;5;241m.\u001b[39mmap_hue(palette\u001b[38;5;241m=\u001b[39mpalette, order\u001b[38;5;241m=\u001b[39mhue_order, norm\u001b[38;5;241m=\u001b[39mhue_norm)\n\u001b[0;32m 745\u001b[0m p\u001b[38;5;241m.\u001b[39mmap_size(sizes\u001b[38;5;241m=\u001b[39msizes, order\u001b[38;5;241m=\u001b[39msize_order, norm\u001b[38;5;241m=\u001b[39msize_norm)\n", "File \u001b[1;32md:\\ProgramData\\anaconda3\\Lib\\site-packages\\seaborn\\relational.py:538\u001b[0m, in \u001b[0;36m_ScatterPlotter.__init__\u001b[1;34m(self, data, variables, legend)\u001b[0m\n\u001b[0;32m 529\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__init__\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;241m*\u001b[39m, data\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m, variables\u001b[38;5;241m=\u001b[39m{}, legend\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m):\n\u001b[0;32m 530\u001b[0m \n\u001b[0;32m 531\u001b[0m \u001b[38;5;66;03m# TODO this is messy, we want the mapping to be agnostic about\u001b[39;00m\n\u001b[0;32m 532\u001b[0m \u001b[38;5;66;03m# the kind of plot to draw, but for the time being we need to set\u001b[39;00m\n\u001b[0;32m 533\u001b[0m \u001b[38;5;66;03m# this information so the SizeMapping can use it\u001b[39;00m\n\u001b[0;32m 534\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_default_size_range \u001b[38;5;241m=\u001b[39m (\n\u001b[0;32m 535\u001b[0m np\u001b[38;5;241m.\u001b[39mr_[\u001b[38;5;241m.5\u001b[39m, \u001b[38;5;241m2\u001b[39m] \u001b[38;5;241m*\u001b[39m np\u001b[38;5;241m.\u001b[39msquare(mpl\u001b[38;5;241m.\u001b[39mrcParams[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mlines.markersize\u001b[39m\u001b[38;5;124m\"\u001b[39m])\n\u001b[0;32m 536\u001b[0m )\n\u001b[1;32m--> 538\u001b[0m \u001b[38;5;28msuper\u001b[39m()\u001b[38;5;241m.\u001b[39m\u001b[38;5;21m__init__\u001b[39m(data\u001b[38;5;241m=\u001b[39mdata, variables\u001b[38;5;241m=\u001b[39mvariables)\n\u001b[0;32m 540\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mlegend \u001b[38;5;241m=\u001b[39m legend\n", "File \u001b[1;32md:\\ProgramData\\anaconda3\\Lib\\site-packages\\seaborn\\_oldcore.py:640\u001b[0m, in \u001b[0;36mVectorPlotter.__init__\u001b[1;34m(self, data, variables)\u001b[0m\n\u001b[0;32m 635\u001b[0m \u001b[38;5;66;03m# var_ordered is relevant only for categorical axis variables, and may\u001b[39;00m\n\u001b[0;32m 636\u001b[0m \u001b[38;5;66;03m# be better handled by an internal axis information object that tracks\u001b[39;00m\n\u001b[0;32m 637\u001b[0m \u001b[38;5;66;03m# such information and is set up by the scale_* methods. The analogous\u001b[39;00m\n\u001b[0;32m 638\u001b[0m \u001b[38;5;66;03m# information for numeric axes would be information about log scales.\u001b[39;00m\n\u001b[0;32m 639\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_var_ordered \u001b[38;5;241m=\u001b[39m {\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mx\u001b[39m\u001b[38;5;124m\"\u001b[39m: \u001b[38;5;28;01mFalse\u001b[39;00m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124my\u001b[39m\u001b[38;5;124m\"\u001b[39m: \u001b[38;5;28;01mFalse\u001b[39;00m} \u001b[38;5;66;03m# alt., used DefaultDict\u001b[39;00m\n\u001b[1;32m--> 640\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39massign_variables(data, variables)\n\u001b[0;32m 642\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m var, \u001b[38;5;28mcls\u001b[39m \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_semantic_mappings\u001b[38;5;241m.\u001b[39mitems():\n\u001b[0;32m 643\u001b[0m \n\u001b[0;32m 644\u001b[0m \u001b[38;5;66;03m# Create the mapping function\u001b[39;00m\n\u001b[0;32m 645\u001b[0m map_func \u001b[38;5;241m=\u001b[39m partial(\u001b[38;5;28mcls\u001b[39m\u001b[38;5;241m.\u001b[39mmap, plotter\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m)\n", "File \u001b[1;32md:\\ProgramData\\anaconda3\\Lib\\site-packages\\seaborn\\_oldcore.py:701\u001b[0m, in \u001b[0;36mVectorPlotter.assign_variables\u001b[1;34m(self, data, variables)\u001b[0m\n\u001b[0;32m 699\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 700\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39minput_format \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mlong\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m--> 701\u001b[0m plot_data, variables \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_assign_variables_longform(\n\u001b[0;32m 702\u001b[0m data, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mvariables,\n\u001b[0;32m 703\u001b[0m )\n\u001b[0;32m 705\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mplot_data \u001b[38;5;241m=\u001b[39m plot_data\n\u001b[0;32m 706\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mvariables \u001b[38;5;241m=\u001b[39m variables\n", "File \u001b[1;32md:\\ProgramData\\anaconda3\\Lib\\site-packages\\seaborn\\_oldcore.py:962\u001b[0m, in \u001b[0;36mVectorPlotter._assign_variables_longform\u001b[1;34m(self, data, **kwargs)\u001b[0m\n\u001b[0;32m 958\u001b[0m variables[key] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mgetattr\u001b[39m(val, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mname\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m)\n\u001b[0;32m 960\u001b[0m \u001b[38;5;66;03m# Construct a tidy plot DataFrame. This will convert a number of\u001b[39;00m\n\u001b[0;32m 961\u001b[0m \u001b[38;5;66;03m# types automatically, aligning on index in case of pandas objects\u001b[39;00m\n\u001b[1;32m--> 962\u001b[0m plot_data \u001b[38;5;241m=\u001b[39m pd\u001b[38;5;241m.\u001b[39mDataFrame(plot_data)\n\u001b[0;32m 964\u001b[0m \u001b[38;5;66;03m# Reduce the variables dictionary to fields with valid data\u001b[39;00m\n\u001b[0;32m 965\u001b[0m variables \u001b[38;5;241m=\u001b[39m {\n\u001b[0;32m 966\u001b[0m var: name\n\u001b[0;32m 967\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m var, name \u001b[38;5;129;01min\u001b[39;00m variables\u001b[38;5;241m.\u001b[39mitems()\n\u001b[0;32m 968\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m plot_data[var]\u001b[38;5;241m.\u001b[39mnotnull()\u001b[38;5;241m.\u001b[39many()\n\u001b[0;32m 969\u001b[0m }\n", "File \u001b[1;32md:\\ProgramData\\anaconda3\\Lib\\site-packages\\pandas\\core\\frame.py:733\u001b[0m, in \u001b[0;36mDataFrame.__init__\u001b[1;34m(self, data, index, columns, dtype, copy)\u001b[0m\n\u001b[0;32m 727\u001b[0m mgr \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_init_mgr(\n\u001b[0;32m 728\u001b[0m data, axes\u001b[38;5;241m=\u001b[39m{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mindex\u001b[39m\u001b[38;5;124m\"\u001b[39m: index, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcolumns\u001b[39m\u001b[38;5;124m\"\u001b[39m: columns}, dtype\u001b[38;5;241m=\u001b[39mdtype, copy\u001b[38;5;241m=\u001b[39mcopy\n\u001b[0;32m 729\u001b[0m )\n\u001b[0;32m 731\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(data, \u001b[38;5;28mdict\u001b[39m):\n\u001b[0;32m 732\u001b[0m \u001b[38;5;66;03m# GH#38939 de facto copy defaults to False only in non-dict cases\u001b[39;00m\n\u001b[1;32m--> 733\u001b[0m mgr \u001b[38;5;241m=\u001b[39m dict_to_mgr(data, index, columns, dtype\u001b[38;5;241m=\u001b[39mdtype, copy\u001b[38;5;241m=\u001b[39mcopy, typ\u001b[38;5;241m=\u001b[39mmanager)\n\u001b[0;32m 734\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(data, ma\u001b[38;5;241m.\u001b[39mMaskedArray):\n\u001b[0;32m 735\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mnumpy\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mma\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m mrecords\n", "File \u001b[1;32md:\\ProgramData\\anaconda3\\Lib\\site-packages\\pandas\\core\\internals\\construction.py:503\u001b[0m, in \u001b[0;36mdict_to_mgr\u001b[1;34m(data, index, columns, dtype, typ, copy)\u001b[0m\n\u001b[0;32m 499\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 500\u001b[0m \u001b[38;5;66;03m# dtype check to exclude e.g. range objects, scalars\u001b[39;00m\n\u001b[0;32m 501\u001b[0m arrays \u001b[38;5;241m=\u001b[39m [x\u001b[38;5;241m.\u001b[39mcopy() \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mhasattr\u001b[39m(x, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdtype\u001b[39m\u001b[38;5;124m\"\u001b[39m) \u001b[38;5;28;01melse\u001b[39;00m x \u001b[38;5;28;01mfor\u001b[39;00m x \u001b[38;5;129;01min\u001b[39;00m arrays]\n\u001b[1;32m--> 503\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m arrays_to_mgr(arrays, columns, index, dtype\u001b[38;5;241m=\u001b[39mdtype, typ\u001b[38;5;241m=\u001b[39mtyp, consolidate\u001b[38;5;241m=\u001b[39mcopy)\n", "File \u001b[1;32md:\\ProgramData\\anaconda3\\Lib\\site-packages\\pandas\\core\\internals\\construction.py:114\u001b[0m, in \u001b[0;36marrays_to_mgr\u001b[1;34m(arrays, columns, index, dtype, verify_integrity, typ, consolidate)\u001b[0m\n\u001b[0;32m 111\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m verify_integrity:\n\u001b[0;32m 112\u001b[0m \u001b[38;5;66;03m# figure out the index, if necessary\u001b[39;00m\n\u001b[0;32m 113\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m index \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m--> 114\u001b[0m index \u001b[38;5;241m=\u001b[39m _extract_index(arrays)\n\u001b[0;32m 115\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 116\u001b[0m index \u001b[38;5;241m=\u001b[39m ensure_index(index)\n", "File \u001b[1;32md:\\ProgramData\\anaconda3\\Lib\\site-packages\\pandas\\core\\internals\\construction.py:664\u001b[0m, in \u001b[0;36m_extract_index\u001b[1;34m(data)\u001b[0m\n\u001b[0;32m 662\u001b[0m raw_lengths\u001b[38;5;241m.\u001b[39mappend(\u001b[38;5;28mlen\u001b[39m(val))\n\u001b[0;32m 663\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(val, np\u001b[38;5;241m.\u001b[39mndarray) \u001b[38;5;129;01mand\u001b[39;00m val\u001b[38;5;241m.\u001b[39mndim \u001b[38;5;241m>\u001b[39m \u001b[38;5;241m1\u001b[39m:\n\u001b[1;32m--> 664\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mPer-column arrays must each be 1-dimensional\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 666\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m indexes \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m raw_lengths:\n\u001b[0;32m 667\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mIf using all scalar values, you must pass an index\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", "\u001b[1;31mValueError\u001b[0m: Per-column arrays must each be 1-dimensional" ] }, { "data": { "image/png": "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tMSNN9543O9dv359FAqFsUdXV1e1YwAAAAAAFWoaGRkZqeYbL7jggvje974Xn/70p8etvfrqq7F48eLo6+uLzs7OcetDQ0MxNDQ09rxcLkdXV1eUSqVjfj0AAAAAcHzlcjkKhcIJ+9qE7hl4xJ49e2LPnj2xatWqY67PmTMn/vCHP8Sbb755zD+8ra0t2traqvmjAQAAAIAqVXWZ8JYtW2L16tXR0tISERHf/OY3Y8uWLWPr//mf/xmnnXaay38BAAAA4BRS1ZmB27ZtixtuuGHs+XnnnRe33nprfPjDH4633347brrpprj++utj5syZUzYoAAAAADA5E46BAwMD0dPTExs3bhw79sUvfjF2794dn/vc52L27Nnx+c9/Pm677bYpHRQAAAAAmJyqNxCZSpXe4BAAAAAAGK/SvlbVPQMBAAAAgOlHDAQAAACAJKraQGSqHblSuVwu13kSAAAAAJh+jnS1E90R8JSIgf39/RER0dXVVedJAAAAAGD66u/vj0KhcNz1U2IDkT/84Q/xxhtvxOzZs6Opqane40y5crkcXV1dsW/fPhukMGW8rqgVry1qweuKWvC6ola8tqgFrytqweuK9xoZGYn+/v4488wz47TTjn9nwFPizMDTTjstzj777HqPUXOdnZ3+52TKeV1RK15b1ILXFbXgdUWteG1RC15X1ILXFUd80BmBR9hABAAAAACSEAMBAAAAIAkx8CRoa2uLv/3bv422trZ6j0ID8bqiVry2qAWvK2rB64pa8dqiFryuqAWvK6pxSmwgAgAAAADUnjMDAQAAACAJMRAAAAAAkhADAQAAACAJMRAAAAAAkhADa+y5556L888/P+bOnRs333xz2K+FqfDzn/88Fi9eHM3NzfHJT34ydu/eXe+RaDCXXXZZbNq0qd5j0GBuueWWuOKKK+o9Bg3i4YcfjgULFkRHR0esWrUqXnnllXqPxDT2u9/9LhYtWnTU68jneCbrWK8rn+OZrGO9rt7L53gqIQbW0NDQUFxxxRXxiU98Ip566qnYtWuX/ymZtL1798YNN9wQGzZsiNdffz3OOeec+PKXv1zvsWgg//iP/xi/+tWv6j0GDea5556L++67L+666656j0ID2Lt3b9x6663x6KOPxq5du+Kcc86J66+/vt5jMU319vbG6tWrj/rF2ud4JutYryuf45msY72u3svneColBtbQL3/5yyiVSnHHHXfEkiVL4rbbbosHH3yw3mMxze3evTtuu+22+MIXvhDz58+Pv/zLv4ynnnqq3mPRIH7/+9/Ht771rfijP/qjeo9CAxkZGYkbb7wxvv71r8eSJUvqPQ4NYOfOnbFy5cpYsWJFLFiwIG644YZ44YUX6j0W09R1110X11133VHHfI5nso71uvI5nsk61uvqCJ/jmYjmeg/QyJ555plYuXJlzJw5MyIili9fHrt27arzVEx3q1evPur5888/Hx/5yEfqNA2N5lvf+lZ8/vOfj4GBgXqPQgP58Y9/HE8//XR8+ctfjl/84hfxp3/6p9HS0lLvsZjGli1bFjt27IidO3fG4sWL4957741LL7203mMxTW3cuDEWL14cX//618eO+RzPZB3rdeVzPJN1rNfVET7HMxHODKyhcrkcixYtGnve1NQUp59+evT19dVxKhrJ8PBw3H777fFXf/VX9R6FBvCv//qvsX379vjBD35Q71FoIAcOHIjvfOc7sXTp0njttdfijjvuiO7u7hgcHKz3aExjy5Yti2uuuSZWrFgRc+bMiZ6enrj99tvrPRbT1OLFi8cd8zmeyTrW6+q9fI6nGsd7Xfkcz0SJgTXU3NwcbW1tRx2bMWNGHDp0qE4T0Wi+853vREdHR/zFX/xFvUdhmhscHIwbb7wxfvSjH0VnZ2e9x6GBbN26NQ4ePBg7duyI7373u/HrX/863nrrrXjooYfqPRrT2JNPPhmPP/549PT0RH9/f6xZsyYuv/xyGzwwZXyOp9Z8jmeq+BxPNcTAGpo3b17s37//qGP9/f3R2tpap4loJP/yL/8S999/f2zevNnldkza3/3d38X5558fn/nMZ+o9Cg3mtddei09+8pMxb968iBj9BXv58uXx8ssv13kyprOf/exncd1118UFF1wQHR0d8f3vfz9eeumleOaZZ+o9Gg3C53hqyed4ppLP8VTDPQNr6Pzzz48HHnhg7Pkrr7wSQ0NDY78QQbVeeuml+LM/+7P40Y9+FMuWLav3ODSAzZs3x/79+2POnDkREXHo0KHYsmVL/Md//Efcd9999R2Oaa2rq2vcvWteffXVuPjii+s0EY3g7bffPupyzf7+/jh48GC88847dZyKRuJzPLXiczxTzed4qiEG1lB3d3eUSqV46KGH4otf/GJs2LAhVq1aFaeffnq9R2MaGxgYiNWrV8eVV14Zn/vc5+LAgQMRETFr1qxoamqq83RMV7/97W/j7bffHnv+N3/zN7Fy5cq4/vrr6zcUDeEzn/lM3HTTTXH//ffH6tWrY+vWrfH000/HZZddVu/RmMYuuuii+NKXvhR33nlnzJ8/Px544IGYP39+LF++vN6j0SB8jqcWfI6nFnyOpxpiYA01NzfHxo0bY+3atXHzzTfHO++8E7/5zW/qPRbT3K9+9avYvXt37N69O3784x+PHX/55Zdj4cKF9RuMae3ss88+6nlHR0cUi8UoFot1mohGMW/evNi2bVt861vfim9+85vx4Q9/OH760596v2JSrr322nj++efjrrvuijfffDPOPffc2Lp1q8vtmDI+x1MLPsdTCz7HU42mEXdarrnXX389nnrqqbjwwgvjjDPOqPc4AABABXyOB6ARiYEAAAAAkITdhAEAAAAgCTEQAAAAAJIQAwEAAAAgCTEQAAAAAJIQAwEAAAAgCTEQAAAAAJIQAwEAAAAgCTEQAAAAAJIQAwEAAAAgif8fWCR656DKE9YAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# 画图\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "\n", "df5 = df.copy()\n", "df5 = df5[['ds','min_price','max_price','LOW_PRICE','LOW_PRICE','CREAT_DATE']]\n", "\n", "print(df5.shape)\n", "print(df5.head(10))\n", "# 画图配置\n", "plt.figure(figsize=(16,10))\n", "\n", "def get_this_week_date(end_time):\n", " endtime = end_time\n", " # endtimeweek = datetime.datetime.strptime(endtime, '%Y-%m-%d')\n", " endtimeweek = endtime\n", " up_week = endtimeweek - datetime.timedelta(days=endtimeweek.weekday() )\n", " up_week_dates = [up_week + datetime.timedelta(days=i) for i in range(7)]\n", " up_week_dates = [date.strftime('%Y-%m-%d') for date in up_week_dates]\n", " return up_week_dates\n", "\n", "# ds分组\n", "end_times = df['ds'].unique()\n", "for endtime in end_times:\n", " up_week_dates = get_this_week_date(endtime)\n", " print(up_week_dates)\n", " df6 = df5[df5['ds'].isin(up_week_dates)]\n", " print(df6.shape)\n", " print(df6.head(10))\n", " # sns画散点图\n", " sns.scatterplot(x=df6.index,y=df6['min_price'].values,data=df6)\n", " sns.scatterplot(x=df6.index,y=df6['max_price'].values,data=df6)\n", " sns.scatterplot(x=df6.index,y=df6['LOW_PRICE'].values,data=df6)\n", " sns.scatterplot(x=df6.index,y=df6['HIGH_PRICE'].values,data=df6)\n", " sns.scatterplot(x=df6.index,y=df6['HIGH_PRICE'].values,data=df6)" ] }, { "cell_type": "code", "execution_count": null, "id": "336fa6ed", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "base", "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.11.7" } }, "nbformat": 4, "nbformat_minor": 5 }