459 lines
52 KiB
Plaintext
459 lines
52 KiB
Plaintext
{
|
|
"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": [
|
|
"<Figure size 1600x1000 with 1 Axes>"
|
|
]
|
|
},
|
|
"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
|
|
}
|