import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from datetime import datetime
data = {
'日期': ['2025-05-28', '2025-05-29', '2025-05-30', '2025-05-31', '2025-06-01',
'2025-06-02', '2025-06-03', '2025-06-04', '2025-06-05', '2025-06-06',
'2025-06-07', '2025-06-08', '2025-06-09', '2025-06-10', '2025-06-11'],
'虹口折后': [1496.34, 1464.4, 1850.47, 1425.84, 1693.63, 1319.31, 1566.13, 1605.27, 1624.29, 2146.28, 2332.54, 1798.36, 1450.63, 1611.31, 1969.45],
'达邦折后': [1554.52, 1029.58, 1278.69, 522.8, 852.43, 815.56, 941.08, 1886.19, 1196.07, 1314.88, 1012.76, 902.19, 1198.96, 1701.82, 2210],
'虹桥折后': [1374.4, 1650.53, 1987, 1074.38, 875.57, 1295.51, 788.44, 1253.21, 1984.51, 1971.15, 1909.46, 1268.89, 1488.22, 1570.41, 1653.19],
'时光里折后': [1934.52, 1244.26, 1890.01, 1280.92, 1118.42, 1342.27, 1701.08, 2241.58, 2511.54, 2376.46, 1694.87, 1563.87, 1693.2, 1842.43, 2434.87],
'凯德折后': [2024.15, 1423.74, 2020.48, 1150.33, 1114.44, 1346.67, 1431.28, 2235.24, 2926.69, 2115.95, 1677.5, 1991.93, 2295.65, 2614.75, 2527.01],
'前滩31折后': [761.78, 1679.73, 1389.27, 1148.44, 990.61, 1122.4, 1237.39, 1372.97, 1281.36, 1986.42, 1726.53, 1577.58, 1473.31, 1740.05, 1607.9],
'来福士折后': [1451.61, 1185.75, 1504.44, 764.27, 821.56, 1209.17, 1477.17, 1337.09, 1229.89, 1545.08, 1236.54, 1459.59, 1349.67, 1884.63, 2086.43],
'森活折后': [2083.87, 1960.6, 1886.79, 1480.83, 1763.94, 1496.93, 1810.01, 1557.74, 1989.61, 2470.86, 1894.58, 1844.4, 2169.59, 2087.89, 2498.43],
'徐汇折后': [2479.75, 1953.06, 3482.91, 1704.93, 2005.33, 2185.23, 2801.19, 2682.71, 3824.14, 3553.09, 3308.08, 2197.09, 2847.93, 2747.53, 4360.16],
'虹口订单': [60, 69, 79, 71, 73, 65, 68, 72, 56, 101, 89, 90, 69, 70, 84],
'达邦订单': [55, 60, 60, 29, 47, 47, 60, 88, 78, 75, 55, 58, 60, 77, 87],
'虹桥订单': [63, 55, 56, 45, 34, 52, 40, 52, 63, 75, 53, 52, 54, 51, 41],
'时光里订单': [77, 57, 70, 50, 49, 49, 68, 80, 79, 100, 67, 65, 68, 79, 98],
'凯德订单': [85, 64, 76, 57, 55, 62, 76, 88, 100, 108, 79, 84, 89, 101, 94],
'前滩31订单': [41, 58, 49, 48, 42, 51, 42, 51, 67, 70, 73, 75, 60, 74, 66],
'来福士订单': [62, 54, 66, 38, 38, 47, 70, 71, 65, 83, 47, 57, 69, 71, 73],
'森活订单': [75, 94, 80, 69, 76, 73, 74, 78, 94, 115, 97, 90, 86, 83, 89],
'徐汇订单': [93, 75, 110, 76, 78, 93, 99, 95, 116, 128, 127, 106, 103, 110, 113]
}
df = pd.DataFrame(data)
stores = ['虹口', '达邦', '虹桥', '时光里', '凯德', '前滩31', '来福士', '森活', '徐汇']
all_data = []
for store in stores:
for i, row in df.iterrows():
date = datetime.strptime(row['日期'], '%Y-%m-%d')
sales = row[f'{store}折后']
orders = row[f'{store}订单']
all_data.append({
'门店': store,
'日期': date,
'折后销售额': sales,
'订单量': orders,
'日均表现': (sales + orders*20)/2
})
plot_df = pd.DataFrame(all_data)
plt.figure(figsize=(14, 10))
sns.scatterplot(data=plot_df, x='订单量', y='折后销售额',
hue='门店', palette='tab20',
size='日均表现', sizes=(50, 400),
alpha=0.8, edgecolor='w', linewidth=0.5)
sns.regplot(data=plot_df, x='订单量', y='折后销售额',
scatter=False, ci=95, line_kws={'color':'red', 'linestyle':'--'})
outliers = [
('徐汇', 4360.16, 113, '最佳表现\n(6月11日)'),
('达邦', 522.8, 29, '最低效率\n(5月31日)'),
('前滩31', 1679.73, 58, '高单价模式'),
('森活', 94, 1960.6, '高订单量')
]
for store, sales, orders, label in outliers:
plt.annotate(label,
xy=(orders, sales),
xytext=(orders+5, sales+200),
arrowprops=dict(arrowstyle='->', color='gray'),
fontsize=9,
bbox=dict(boxstyle="round,pad=0.3", fc='white', alpha=0.8))
plt.title('9家门店每日表现分析 (2025-05-28 至 2025-06-11)', fontsize=16, pad=20)
plt.xlabel('订单量 (单)', fontsize=12)
plt.ylabel('折后销售额 (元)', fontsize=12)
plt.grid(True, linestyle='--', alpha=0.7)
plt.legend(title='门店', loc='upper left', bbox_to_anchor=(1, 1))
plt.tight_layout()
plt.figtext(0.5, 0.01,
'数据趋势:订单量与销售额呈正相关 (r=0.82) | 徐汇店持续领先 | 达邦店波动最大',
ha='center', fontsize=10, style='italic')
plt.show()