├── .idea ├── .gitignore ├── Falsk_data_analysis.iml ├── inspectionProfiles │ ├── Project_Default.xml │ └── profiles_settings.xml ├── misc.xml ├── modules.xml └── sonarlint │ ├── issuestore │ ├── 0 │ │ └── 3 │ │ │ └── 03c662df16e381bee8f2324f4c608a64bbe31aae │ ├── 1 │ │ └── 3 │ │ │ └── 13cce7fd076299c81b4986166f3d822791c9490e │ ├── 3 │ │ ├── 1 │ │ │ └── 31ff30cbab30d05e59f86b00b1ff3ae1040f4e07 │ │ └── 8 │ │ │ └── 385b876c92d68fdeb1f5627942c96768baac1b75 │ ├── 4 │ │ ├── 7 │ │ │ └── 4706701c005a11d84d8ae7731365c7c336e3f466 │ │ ├── a │ │ │ └── 4a04f3b254dfdbd7bfdfed237feaa64d55595329 │ │ └── e │ │ │ └── 4ef40c7db1df9c35e00f43da5b7f1acb22495ad2 │ ├── 5 │ │ ├── 5 │ │ │ └── 55e2e6e17be61b8b11ec897659f10ac03ae08ea6 │ │ └── d │ │ │ └── 5d336e7cc40661aa6b1265148bf0c58d73c6d6f5 │ ├── 6 │ │ ├── 1 │ │ │ └── 61214f442c221dd3d714652255e62c367f993469 │ │ ├── 7 │ │ │ └── 67b2e8ddf1a742525530d14c1a17d6ce418c6f20 │ │ ├── b │ │ │ └── 6b89e3a2a4ce5be6f1f17b81f488b078ca6d3a0c │ │ ├── c │ │ │ └── 6cea50f6dec863243499abfdf9a2d68972f724b4 │ │ └── e │ │ │ └── 6ec4dc02c0d9c94ad0c8bd8b96be99a633f84078 │ ├── 7 │ │ └── 5 │ │ │ └── 752b4651946f98f8bf87f52ebd7514cb43e9698e │ ├── 8 │ │ └── 5 │ │ │ └── 85cb8884720f7559f24a81be0805fbc3804e0334 │ ├── 9 │ │ └── 0 │ │ │ └── 90d05bfd69244edf482f47b773758930c376bd55 │ ├── b │ │ └── 0 │ │ │ └── b08453aee75a23634345ebe8d2253f4401716149 │ ├── c │ │ └── e │ │ │ └── ce4f796c5be8947b7ba7705fab2b891600f264e5 │ ├── f │ │ ├── 2 │ │ │ └── f2aa1877262ad8572d1a58fd2492878f7250f7cc │ │ ├── 3 │ │ │ └── f3ef31268b0bb93ec9f8c770b5c74bfea3a407f8 │ │ └── 5 │ │ │ └── f5da62ee9a53d9ac455215e7ec2ad04962c6b552 │ └── index.pb │ └── securityhotspotstore │ ├── 0 │ └── 3 │ │ └── 03c662df16e381bee8f2324f4c608a64bbe31aae │ ├── 1 │ └── 3 │ │ └── 13cce7fd076299c81b4986166f3d822791c9490e │ ├── 3 │ ├── 1 │ │ └── 31ff30cbab30d05e59f86b00b1ff3ae1040f4e07 │ └── 8 │ │ └── 385b876c92d68fdeb1f5627942c96768baac1b75 │ ├── 4 │ ├── 7 │ │ └── 4706701c005a11d84d8ae7731365c7c336e3f466 │ ├── a │ │ └── 4a04f3b254dfdbd7bfdfed237feaa64d55595329 │ └── e │ │ └── 4ef40c7db1df9c35e00f43da5b7f1acb22495ad2 │ ├── 5 │ ├── 5 │ │ └── 55e2e6e17be61b8b11ec897659f10ac03ae08ea6 │ └── d │ │ └── 5d336e7cc40661aa6b1265148bf0c58d73c6d6f5 │ ├── 6 │ ├── 1 │ │ └── 61214f442c221dd3d714652255e62c367f993469 │ ├── 7 │ │ └── 67b2e8ddf1a742525530d14c1a17d6ce418c6f20 │ ├── b │ │ └── 6b89e3a2a4ce5be6f1f17b81f488b078ca6d3a0c │ ├── c │ │ └── 6cea50f6dec863243499abfdf9a2d68972f724b4 │ └── e │ │ └── 6ec4dc02c0d9c94ad0c8bd8b96be99a633f84078 │ ├── 7 │ └── 5 │ │ └── 752b4651946f98f8bf87f52ebd7514cb43e9698e │ ├── 8 │ └── 5 │ │ └── 85cb8884720f7559f24a81be0805fbc3804e0334 │ ├── 9 │ └── 0 │ │ └── 90d05bfd69244edf482f47b773758930c376bd55 │ ├── b │ └── 0 │ │ └── b08453aee75a23634345ebe8d2253f4401716149 │ ├── c │ └── e │ │ └── ce4f796c5be8947b7ba7705fab2b891600f264e5 │ ├── f │ ├── 2 │ │ └── f2aa1877262ad8572d1a58fd2492878f7250f7cc │ ├── 3 │ │ └── f3ef31268b0bb93ec9f8c770b5c74bfea3a407f8 │ └── 5 │ │ └── f5da62ee9a53d9ac455215e7ec2ad04962c6b552 │ └── index.pb ├── README.md ├── app.py ├── core ├── __init__.py ├── __pycache__ │ ├── __init__.cpython-310.pyc │ ├── data_fenxi.cpython-310.pyc │ ├── day_danri_pyecharts.cpython-310.pyc │ ├── many_day_pyecharts.cpython-310.pyc │ ├── models.cpython-310.pyc │ ├── utility.cpython-310.pyc │ └── views.cpython-310.pyc ├── data_fenxi.py ├── day_danri_pyecharts.py ├── many_day_pyecharts.py ├── models.py ├── static │ ├── css │ │ ├── analysis.css │ │ ├── base.css │ │ ├── logins.css │ │ ├── query.css │ │ └── visualization.css │ ├── image │ │ ├── 120.png │ │ ├── 121.png │ │ ├── 122.png │ │ ├── 123.png │ │ ├── 124.png │ │ ├── base.png │ │ ├── dlbjt.jpg │ │ ├── loging22.jpg │ │ └── 选择文件.png │ └── js │ │ ├── analysis.js │ │ └── query.js ├── templates │ ├── analysis.html │ ├── base.html │ ├── index.html │ ├── login.html │ ├── query.html │ ├── register.html │ └── visualization.html ├── utility.py └── views.py └── 技术文档 └── flask电商数据分析技术文档.pdf /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # 默认忽略的文件 2 | /shelf/ 3 | /workspace.xml 4 | -------------------------------------------------------------------------------- /.idea/Falsk_data_analysis.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 37 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/0/3/03c662df16e381bee8f2324f4c608a64bbe31aae: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/.idea/sonarlint/issuestore/0/3/03c662df16e381bee8f2324f4c608a64bbe31aae -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/1/3/13cce7fd076299c81b4986166f3d822791c9490e: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/.idea/sonarlint/issuestore/1/3/13cce7fd076299c81b4986166f3d822791c9490e -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/3/1/31ff30cbab30d05e59f86b00b1ff3ae1040f4e07: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/.idea/sonarlint/issuestore/3/1/31ff30cbab30d05e59f86b00b1ff3ae1040f4e07 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/3/8/385b876c92d68fdeb1f5627942c96768baac1b75: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/.idea/sonarlint/issuestore/3/8/385b876c92d68fdeb1f5627942c96768baac1b75 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/4/7/4706701c005a11d84d8ae7731365c7c336e3f466: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/.idea/sonarlint/issuestore/4/7/4706701c005a11d84d8ae7731365c7c336e3f466 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/4/a/4a04f3b254dfdbd7bfdfed237feaa64d55595329: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/.idea/sonarlint/issuestore/4/a/4a04f3b254dfdbd7bfdfed237feaa64d55595329 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/4/e/4ef40c7db1df9c35e00f43da5b7f1acb22495ad2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/.idea/sonarlint/issuestore/4/e/4ef40c7db1df9c35e00f43da5b7f1acb22495ad2 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/5/5/55e2e6e17be61b8b11ec897659f10ac03ae08ea6: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/.idea/sonarlint/issuestore/5/5/55e2e6e17be61b8b11ec897659f10ac03ae08ea6 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/5/d/5d336e7cc40661aa6b1265148bf0c58d73c6d6f5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/.idea/sonarlint/issuestore/5/d/5d336e7cc40661aa6b1265148bf0c58d73c6d6f5 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/6/1/61214f442c221dd3d714652255e62c367f993469: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/.idea/sonarlint/issuestore/6/1/61214f442c221dd3d714652255e62c367f993469 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/6/7/67b2e8ddf1a742525530d14c1a17d6ce418c6f20: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/.idea/sonarlint/issuestore/6/7/67b2e8ddf1a742525530d14c1a17d6ce418c6f20 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/6/b/6b89e3a2a4ce5be6f1f17b81f488b078ca6d3a0c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/.idea/sonarlint/issuestore/6/b/6b89e3a2a4ce5be6f1f17b81f488b078ca6d3a0c -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/6/c/6cea50f6dec863243499abfdf9a2d68972f724b4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/.idea/sonarlint/issuestore/6/c/6cea50f6dec863243499abfdf9a2d68972f724b4 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/6/e/6ec4dc02c0d9c94ad0c8bd8b96be99a633f84078: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/.idea/sonarlint/issuestore/6/e/6ec4dc02c0d9c94ad0c8bd8b96be99a633f84078 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/7/5/752b4651946f98f8bf87f52ebd7514cb43e9698e: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/.idea/sonarlint/issuestore/7/5/752b4651946f98f8bf87f52ebd7514cb43e9698e -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/8/5/85cb8884720f7559f24a81be0805fbc3804e0334: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/.idea/sonarlint/issuestore/8/5/85cb8884720f7559f24a81be0805fbc3804e0334 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/9/0/90d05bfd69244edf482f47b773758930c376bd55: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/.idea/sonarlint/issuestore/9/0/90d05bfd69244edf482f47b773758930c376bd55 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/b/0/b08453aee75a23634345ebe8d2253f4401716149: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/.idea/sonarlint/issuestore/b/0/b08453aee75a23634345ebe8d2253f4401716149 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/c/e/ce4f796c5be8947b7ba7705fab2b891600f264e5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/.idea/sonarlint/issuestore/c/e/ce4f796c5be8947b7ba7705fab2b891600f264e5 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/f/2/f2aa1877262ad8572d1a58fd2492878f7250f7cc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/.idea/sonarlint/issuestore/f/2/f2aa1877262ad8572d1a58fd2492878f7250f7cc -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/f/3/f3ef31268b0bb93ec9f8c770b5c74bfea3a407f8: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/.idea/sonarlint/issuestore/f/3/f3ef31268b0bb93ec9f8c770b5c74bfea3a407f8 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/f/5/f5da62ee9a53d9ac455215e7ec2ad04962c6b552: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/.idea/sonarlint/issuestore/f/5/f5da62ee9a53d9ac455215e7ec2ad04962c6b552 -------------------------------------------------------------------------------- /.idea/sonarlint/issuestore/index.pb: -------------------------------------------------------------------------------- 1 | 2 | J 3 | core/static/css/logins.css,7\5\752b4651946f98f8bf87f52ebd7514cb43e9698e 4 | H 5 | core/static/css/base.css,f\5\f5da62ee9a53d9ac455215e7ec2ad04962c6b552 6 | I 7 | core/templates/query.html,6\c\6cea50f6dec863243499abfdf9a2d68972f724b4 8 | I 9 | core/static/css/query.css,5\5\55e2e6e17be61b8b11ec897659f10ac03ae08ea6 10 | G 11 | core/static/js/query.js,8\5\85cb8884720f7559f24a81be0805fbc3804e0334 12 | L 13 | core/static/css/analysis.css,b\0\b08453aee75a23634345ebe8d2253f4401716149 14 | J 15 | core/static/js/analysis.js,6\7\67b2e8ddf1a742525530d14c1a17d6ce418c6f20 16 | L 17 | core/templates/analysis.html,0\3\03c662df16e381bee8f2324f4c608a64bbe31aae 18 | Q 19 | !core/static/css/visualization.css,3\8\385b876c92d68fdeb1f5627942c96768baac1b75 20 | J 21 | core/many_day_pyecharts.py,4\a\4a04f3b254dfdbd7bfdfed237feaa64d55595329 22 | Q 23 | !core/templates/visualization.html,6\e\6ec4dc02c0d9c94ad0c8bd8b96be99a633f84078 24 | 6 25 | app.py,1\3\13cce7fd076299c81b4986166f3d822791c9490e 26 | B 27 | core/data_fenxi.py,9\0\90d05bfd69244edf482f47b773758930c376bd55 28 | K 29 | core/day_danri_pyecharts.py,6\b\6b89e3a2a4ce5be6f1f17b81f488b078ca6d3a0c 30 | ? 31 | core/utility.py,f\3\f3ef31268b0bb93ec9f8c770b5c74bfea3a407f8 32 | H 33 | core/templates/base.html,4\e\4ef40c7db1df9c35e00f43da5b7f1acb22495ad2 34 | = 35 | core/views.py,4\7\4706701c005a11d84d8ae7731365c7c336e3f466 36 | > 37 | core/models.py,f\2\f2aa1877262ad8572d1a58fd2492878f7250f7cc 38 | @ 39 | core/__init__.py,c\e\ce4f796c5be8947b7ba7705fab2b891600f264e5 40 | L 41 | core/templates/register.html,5\d\5d336e7cc40661aa6b1265148bf0c58d73c6d6f5 42 | I 43 | core/templates/index.html,6\1\61214f442c221dd3d714652255e62c367f993469 44 | I 45 | core/templates/login.html,3\1\31ff30cbab30d05e59f86b00b1ff3ae1040f4e07 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/0/3/03c662df16e381bee8f2324f4c608a64bbe31aae: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/.idea/sonarlint/securityhotspotstore/0/3/03c662df16e381bee8f2324f4c608a64bbe31aae -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/1/3/13cce7fd076299c81b4986166f3d822791c9490e: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/.idea/sonarlint/securityhotspotstore/1/3/13cce7fd076299c81b4986166f3d822791c9490e -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/3/1/31ff30cbab30d05e59f86b00b1ff3ae1040f4e07: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/.idea/sonarlint/securityhotspotstore/3/1/31ff30cbab30d05e59f86b00b1ff3ae1040f4e07 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/3/8/385b876c92d68fdeb1f5627942c96768baac1b75: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/.idea/sonarlint/securityhotspotstore/3/8/385b876c92d68fdeb1f5627942c96768baac1b75 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/4/7/4706701c005a11d84d8ae7731365c7c336e3f466: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/.idea/sonarlint/securityhotspotstore/4/7/4706701c005a11d84d8ae7731365c7c336e3f466 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/4/a/4a04f3b254dfdbd7bfdfed237feaa64d55595329: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/.idea/sonarlint/securityhotspotstore/4/a/4a04f3b254dfdbd7bfdfed237feaa64d55595329 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/4/e/4ef40c7db1df9c35e00f43da5b7f1acb22495ad2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/.idea/sonarlint/securityhotspotstore/4/e/4ef40c7db1df9c35e00f43da5b7f1acb22495ad2 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/5/5/55e2e6e17be61b8b11ec897659f10ac03ae08ea6: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/.idea/sonarlint/securityhotspotstore/5/5/55e2e6e17be61b8b11ec897659f10ac03ae08ea6 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/5/d/5d336e7cc40661aa6b1265148bf0c58d73c6d6f5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/.idea/sonarlint/securityhotspotstore/5/d/5d336e7cc40661aa6b1265148bf0c58d73c6d6f5 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/6/1/61214f442c221dd3d714652255e62c367f993469: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/.idea/sonarlint/securityhotspotstore/6/1/61214f442c221dd3d714652255e62c367f993469 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/6/7/67b2e8ddf1a742525530d14c1a17d6ce418c6f20: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/.idea/sonarlint/securityhotspotstore/6/7/67b2e8ddf1a742525530d14c1a17d6ce418c6f20 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/6/b/6b89e3a2a4ce5be6f1f17b81f488b078ca6d3a0c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/.idea/sonarlint/securityhotspotstore/6/b/6b89e3a2a4ce5be6f1f17b81f488b078ca6d3a0c -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/6/c/6cea50f6dec863243499abfdf9a2d68972f724b4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/.idea/sonarlint/securityhotspotstore/6/c/6cea50f6dec863243499abfdf9a2d68972f724b4 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/6/e/6ec4dc02c0d9c94ad0c8bd8b96be99a633f84078: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/.idea/sonarlint/securityhotspotstore/6/e/6ec4dc02c0d9c94ad0c8bd8b96be99a633f84078 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/7/5/752b4651946f98f8bf87f52ebd7514cb43e9698e: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/.idea/sonarlint/securityhotspotstore/7/5/752b4651946f98f8bf87f52ebd7514cb43e9698e -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/8/5/85cb8884720f7559f24a81be0805fbc3804e0334: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/.idea/sonarlint/securityhotspotstore/8/5/85cb8884720f7559f24a81be0805fbc3804e0334 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/9/0/90d05bfd69244edf482f47b773758930c376bd55: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/.idea/sonarlint/securityhotspotstore/9/0/90d05bfd69244edf482f47b773758930c376bd55 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/b/0/b08453aee75a23634345ebe8d2253f4401716149: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/.idea/sonarlint/securityhotspotstore/b/0/b08453aee75a23634345ebe8d2253f4401716149 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/c/e/ce4f796c5be8947b7ba7705fab2b891600f264e5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/.idea/sonarlint/securityhotspotstore/c/e/ce4f796c5be8947b7ba7705fab2b891600f264e5 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/f/2/f2aa1877262ad8572d1a58fd2492878f7250f7cc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/.idea/sonarlint/securityhotspotstore/f/2/f2aa1877262ad8572d1a58fd2492878f7250f7cc -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/f/3/f3ef31268b0bb93ec9f8c770b5c74bfea3a407f8: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/.idea/sonarlint/securityhotspotstore/f/3/f3ef31268b0bb93ec9f8c770b5c74bfea3a407f8 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/f/5/f5da62ee9a53d9ac455215e7ec2ad04962c6b552: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/.idea/sonarlint/securityhotspotstore/f/5/f5da62ee9a53d9ac455215e7ec2ad04962c6b552 -------------------------------------------------------------------------------- /.idea/sonarlint/securityhotspotstore/index.pb: -------------------------------------------------------------------------------- 1 | 2 | J 3 | core/static/css/logins.css,7\5\752b4651946f98f8bf87f52ebd7514cb43e9698e 4 | H 5 | core/static/css/base.css,f\5\f5da62ee9a53d9ac455215e7ec2ad04962c6b552 6 | I 7 | core/templates/query.html,6\c\6cea50f6dec863243499abfdf9a2d68972f724b4 8 | I 9 | core/static/css/query.css,5\5\55e2e6e17be61b8b11ec897659f10ac03ae08ea6 10 | G 11 | core/static/js/query.js,8\5\85cb8884720f7559f24a81be0805fbc3804e0334 12 | L 13 | core/static/css/analysis.css,b\0\b08453aee75a23634345ebe8d2253f4401716149 14 | J 15 | core/static/js/analysis.js,6\7\67b2e8ddf1a742525530d14c1a17d6ce418c6f20 16 | L 17 | core/templates/analysis.html,0\3\03c662df16e381bee8f2324f4c608a64bbe31aae 18 | Q 19 | !core/templates/visualization.html,6\e\6ec4dc02c0d9c94ad0c8bd8b96be99a633f84078 20 | Q 21 | !core/static/css/visualization.css,3\8\385b876c92d68fdeb1f5627942c96768baac1b75 22 | J 23 | core/many_day_pyecharts.py,4\a\4a04f3b254dfdbd7bfdfed237feaa64d55595329 24 | 6 25 | app.py,1\3\13cce7fd076299c81b4986166f3d822791c9490e 26 | B 27 | core/data_fenxi.py,9\0\90d05bfd69244edf482f47b773758930c376bd55 28 | K 29 | core/day_danri_pyecharts.py,6\b\6b89e3a2a4ce5be6f1f17b81f488b078ca6d3a0c 30 | @ 31 | core/__init__.py,c\e\ce4f796c5be8947b7ba7705fab2b891600f264e5 32 | ? 33 | core/utility.py,f\3\f3ef31268b0bb93ec9f8c770b5c74bfea3a407f8 34 | > 35 | core/models.py,f\2\f2aa1877262ad8572d1a58fd2492878f7250f7cc 36 | H 37 | core/templates/base.html,4\e\4ef40c7db1df9c35e00f43da5b7f1acb22495ad2 38 | = 39 | core/views.py,4\7\4706701c005a11d84d8ae7731365c7c336e3f466 40 | I 41 | core/templates/index.html,6\1\61214f442c221dd3d714652255e62c367f993469 42 | I 43 | core/templates/login.html,3\1\31ff30cbab30d05e59f86b00b1ff3ae1040f4e07 44 | L 45 | core/templates/register.html,5\d\5d336e7cc40661aa6b1265148bf0c58d73c6d6f5 -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Falsk_data_analysis 2 | 电商数据分析可视化web系统 3 | FLASK 电商数据分析技术文档 4 | 目录 5 | 1 引言 6 | 1.1 项目背景 7 | 1.2 目标与范围 8 | 2 项目架构 9 | 2.1 技术栈 10 | 2.2 主要组件 11 | 3 安装与配置 12 | 3.1 系统要求 13 | 3.2 第三方支持库 14 | 4 使用指南 15 | 4.1 用户认证 16 | 4.2 数据的导入与显示 17 | 4.3 数据分析功能 18 | 4.4 数据可视化 19 | 5 数据模型 20 | 5.1 数据库建立 21 | 5.2 数据库联通 22 | 6.页面效果 23 | 6.1 登录页面 24 | 6.2 注册页面 25 | 6.3 首页 26 | 6.4 数据管理 27 | 6.5 数据分析 28 | 6.6 数据可视化 29 | 引言 30 | 1.1 项目背景 31 | 项目旨在利用电商运营信息和商品销售数据进行深入的数据分析。为实现这一目标,我们采 32 | 用了 Flask 框架来存储运营信息数据,并通过 Web 页面将其直观地呈现给用户。此外, 33 | 我们还实现了注册和登录界面,以确保用户安全且方便地访问系统。 34 | 1.2 目标与范围 35 | 目标: 36 | 项目旨在实现一下主要目标: 37 | 1. 利用电商运营信息和商品销售数据进行深入的数据分析,提供关键业务洞察和决策支 38 | 持, 39 | 2. 通过 flask 框架建立一个可以扩展数据存储电商运营信息数据,确保数据可靠性和持久 40 | 性 41 | 3. 开发直观的 web 页面,以可视化方式呈现运营信息数据,使用户能够轻松李娇儿和分 42 | 析数据的趋势。 43 | 4. 提供登录注册界面,确保系统的安全性,只有经过授权和注册的用户才能访问敏感数据 44 | 和功能。 范围: 45 |  项目的范围包括一下几方面: 46 | 1. 数据导入:从不同平台收集到的信息存储在 excel 中后导入到 web 程序中, 47 | 2. 数据存储:将清洗后的数据存储到 flask 架构的数据库中,方便后续分析和可视化使用 48 | 3. 数据分析:实时数据分析算法和工具,生成有关运营信息和销售数据的价值见解 49 | 4. 数据可视化:创建可视化工具,直观的展示数据 50 | 5. 用户认证:开发注册和登录界面,实施用户身份和授权机制 51 | 项目架构 52 | 1.1 技术栈 53 | 技术栈 54 | 项目采用一下技术栈: 55 | 1. 后端开发: 56 | a) Flask 作为 web 框架,用于处理 http 请求和构建 web 应用 57 | b) Python 作为主要变成语言用于后端业务逻辑的开发 58 | c) SQLAlchemy 用于数据库操作和管理,提供了 orm 对象映射功能 59 | 2. 前端开发: 60 | a) Html/css/js:用于构建 web 页面和用户界面 61 | 3. 数据库: 62 | a) Mysql 用于生产环境的关系形数据库,存储电商数据和用户管理 63 | 4. 数据分析工具: 64 | a) Pandas 用于数据清洗和处理 65 | b) Pyecharts 用于数据可视化 66 | 5. 用户认证和安全性 67 | a) Falsk-login 用户用户认证和授权 68 | 主要组件 69 | 电商数据分析系统包括一下组件: 70 | 1. Web 应用前端是用户与系统互动界面,包括注册以及登录和可视化页面以及数据分析 71 | 页面 72 | 2. Flaskweb 应用后端是系统的核心,负责处理 http 请求,数据分析,用户认证和数据库 73 | 操作 74 | 3. 数据库使用关系形数据库 mysql 来存储管理电商数据,包括隐形信息和商品销售信息的 75 | 存储 76 | 4. 数据处理模块:负责用户导入 excel 的数据源的处理,通过用户的操作进行电商数据, 77 | 运营新的处理和存储数据库的后端操作 78 | 5. 用户认证模块:可以进行注册以及登录和账户管理模块确保系统的安全性 79 | 6. 可视化组件:用户创建各种图表和可视化工具,方便用户直观的理解数据 80 | 安装与配置 81 | 系统要求 82 | 1.开发环境 win 系统 83 | 第三方支持库 84 | 项目以来一下第三方支持库来实现不同的功能: 85 | 1. Flask 2.3.3:作为主要的 Web 框架,用于构建后端并处理 HTTP 请求。 86 | 2. Flask-Login 0.6.2:用于用户登录验证和管理,增强系统的安全性。 87 | 3. Flask-SQLAlchemy 3.0.5:用于数据库操作和管理,提供了对象关系映射(ORM)功能, 88 | 简化了与数据库的交互。 89 | 4. Pandas 2.0.3:用于高效处理电商数据管理系统的数据,包括导入、清洗和分析。 90 | 5. Pyecharts 2.0.4:用于系统的数据可视化,支持创建各种图表和可视化工具,使数据更 91 | 容易理解。 92 | 使用指南 93 | 1 用户认证 94 | 用户认证包括一下: 95 | 1. 设定了用户登录界面与注册界面, 96 | 2. 后端对用户的密码进行了加密处理使用户的信息更加的安全,登录的同时使用密码解密 97 | 进行验证, 98 | 3. 数据的导入与显示 99 | 数据的导入: 100 | 1. 在 html 数据管理界面中选择上传的 excel 数据表格,通过导入数据后选择对数据的显示 101 | 或保存操作 102 | 4. 数据分析功能 103 | 数据分析的功能包括: 104 | 1..本模块主要是对已经保存到数据库中的数据按照日期进行单日或多日的经营数据和商品 105 | 品类的销售数据的分析,经营数据分析主要分析出商品的 ctr/转化率/件单价/,销售品类数 106 | 据主要统计出每日的销售总量和分类的销售量 107 | 5.数据可视化 108 | 数据可视化功能包括: 109 | 1. 本模块主要是对存储到数据库中的数据按照日期进行单日和多日的经营数据和商品品 110 | 类销售数据的可视化显示制作,通过用户的操作来完成单日或多日的数据可视化,数据 111 | 可视化分为经营数据可视化和商品品类销售数据可视化,可视化主图是柱形图展示,附 112 | 图是以饼形图来展示每种数据的对比 113 | 数据模型 114 | 1. 数据库建立 115 | 为了存储数据管理电商数据,在程序中使用了关系模型数据库,以下是数据库建立的步骤: 116 | 1. 根据技术经验,数据库选择使 mysql, 117 | 2. 使用 sq 语句进行数据数据库的创建,在数据库中创建两张表格,一张用于存储注册用 118 | 户信息,一张用于存储电商数据 119 | 3. 电商数据存储表格创建完成后,在数据存储与数据管理以及数据查询的过程中通过映射 120 | 关系来完成数据库的存储和查询操作 121 | 2. 数据库的联通 122 | 在程序的 __init__.py 文件中进行数据库对象关系映射(ORM)的配置,包括以下步骤: 123 | 1. 使用 SQLAlchemy 库配置数据库连接,设置数据库地址以及其他相关参数。这个配 124 | 置通常包括数据库的连接 URL、密钥等重要信息。这里还可以将 Flask 实例封装在 125 | SQLAlchemy 中以便于在 Flask 程序中进行数据库操作。创建数据库映射模块,使用 flask 126 | 2. 在 models 模块中创建实例以及 sqlalchemy,在这个模块中映射数据库表格,这回 127 | 在应用的其他模块中创建模型类,来完成数据库的增删改查的操作 128 | -------------------------------------------------------------------------------- /app.py: -------------------------------------------------------------------------------- 1 | from core import app 2 | 3 | if __name__ == '__main__': 4 | app.run(host='127.0.0.1', port=5001, debug=True) 5 | -------------------------------------------------------------------------------- /core/__init__.py: -------------------------------------------------------------------------------- 1 | ''' 2 | 项目数据库配置模块 3 | ''' 4 | import os 5 | import sys 6 | import pymysql 7 | from flask import Flask 8 | from flask_login import LoginManager 9 | from flask_sqlalchemy import SQLAlchemy 10 | 11 | '''数据库配置选项''' 12 | pymysql.install_as_MySQLdb() # 代替MySQLdb,使用pymysql 13 | 14 | WIN = sys.platform.startswith('win') 15 | 16 | if WIN: 17 | prefix = 'sqlite///' 18 | else: 19 | prefix = 'sqlite////' 20 | 21 | app = Flask(__name__) 22 | app.config['SECRET_KEY'] = os.getenv('SECRET_KEY', 'dev') 23 | app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:qazwsx%40123@127.0.0.1:3306/falsk_analysis' 24 | app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False 25 | 26 | db = SQLAlchemy(app) # 封装flask实例到炼丹中 27 | login_manager = LoginManager(app) # 创建管理器实例 28 | 29 | 30 | @login_manager.user_loader # 指定函数加载用户,返回对象 31 | def load_user(user_id): 32 | from core.models import Admin 33 | user = Admin.query.get(int(user_id)) 34 | return user 35 | 36 | 37 | login_manager.login_view = 'login' 38 | 39 | 40 | from core import views -------------------------------------------------------------------------------- /core/__pycache__/__init__.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/core/__pycache__/__init__.cpython-310.pyc -------------------------------------------------------------------------------- /core/__pycache__/data_fenxi.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/core/__pycache__/data_fenxi.cpython-310.pyc -------------------------------------------------------------------------------- /core/__pycache__/day_danri_pyecharts.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/core/__pycache__/day_danri_pyecharts.cpython-310.pyc -------------------------------------------------------------------------------- /core/__pycache__/many_day_pyecharts.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/core/__pycache__/many_day_pyecharts.cpython-310.pyc -------------------------------------------------------------------------------- /core/__pycache__/models.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/core/__pycache__/models.cpython-310.pyc -------------------------------------------------------------------------------- /core/__pycache__/utility.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/core/__pycache__/utility.cpython-310.pyc -------------------------------------------------------------------------------- /core/__pycache__/views.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/core/__pycache__/views.cpython-310.pyc -------------------------------------------------------------------------------- /core/data_fenxi.py: -------------------------------------------------------------------------------- 1 | '''数据分析模块文件''' 2 | 3 | import pandas as pd 4 | from core.utility import parse_date_string 5 | from core.models import Table 6 | from sqlalchemy import and_ 7 | 8 | '''数据读取方法''' 9 | 10 | 11 | def commerce(data): 12 | ''' 13 | 14 | :param data: 数据分析文件 15 | :return: 返回数据显示文件 16 | ''' 17 | commerce_df = pd.read_excel(data) 18 | return commerce_df 19 | 20 | 21 | '''单日数据获取查询清洗转换数据库中的数据为pandas数据格式,为接下来的数据分析做准备''' 22 | 23 | 24 | def get_single_day_data(analysis_route_single): 25 | ''' 26 | 27 | :param analysis_route_single: 转换完成的日期类数据 28 | :return: 返回一个pandas数据格式 29 | ''' 30 | # 解析日期字符串为日期对象 31 | analysis_route_parse = parse_date_string(date_str=analysis_route_single) 32 | 33 | # 查询特定日期的数据 34 | single_day_data = Table.query.filter_by(sale_data=analysis_route_parse).all() # 数据库获取指定日期的数据 35 | 36 | # 创建数据字典列表 37 | data_dict_list = [{'货号': row.produtc_code, '日期': row.sale_data, '客户数': row.customer_counts, 38 | '销售额': row.tltal_sales, '销售量(含拒退)': row.total_quantity, 39 | '销售额(扣满减含拒退)': row.sales_after_discount, 'UV': row.uv, 40 | '转化率': row.conversion_rate, '商品CTR': row.product_ctr, 41 | '曝光UV': row.exposure_uv, '款号辅助': row.style_code_auxiliary, 42 | '销售区间': row.sales_range, '品类': row.category, '活动': row.activity, 43 | '到手价': row.net_price, '到手价区间': row.net_price_range 44 | } for row in single_day_data] 45 | 46 | # 转换为Pandas DataFrame 47 | df = pd.DataFrame(data_dict_list) 48 | 49 | return df 50 | 51 | 52 | '''单日经营数据分析类型/品类数据销售类型''' 53 | 54 | 55 | def Get_fenxi_day_data(dataframe): 56 | ''' 57 | 58 | :param Day_input_data: 数据库按照日期抽取的文件 59 | :return: 60 | ''' 61 | data_time = dataframe['日期'].iloc[0] 62 | buv_sum = round(dataframe['曝光UV'].sum(), 2) 63 | uv_sum = dataframe['UV'].sum() 64 | ctr_sp = (uv_sum / buv_sum) * 100 65 | kh_sum = dataframe['客户数'].sum() 66 | kh_uv = (kh_sum / uv_sum) * 100 67 | xse_sum = dataframe['销售额'].sum() 68 | xsl_sum = dataframe['销售量(含拒退)'].sum() 69 | ping_dan_jian = xse_sum / xsl_sum 70 | 71 | result_dict = { 72 | '日期': data_time, 73 | '曝光UV总和': buv_sum, 74 | 'UV总和': uv_sum, 75 | 'CTR': ctr_sp, 76 | '客户数总和': kh_sum, 77 | 'UV客户转化率': kh_uv, 78 | '销售额总和': xse_sum, 79 | '销售量总和': xsl_sum, 80 | '平均单价': ping_dan_jian, 81 | } 82 | 83 | '''品类销售代码''' 84 | commerce_grupds = dataframe.groupby(['品类'])['销售量(含拒退)'].sum().reset_index() # 统计每个品类的销售量 85 | commerce_grupds_sum = commerce_grupds.sum() 86 | 87 | # 创建一个包含销售总量的字典 88 | category_data = { 89 | '销售总量': commerce_grupds_sum['销售量(含拒退)'], 90 | **commerce_grupds.set_index('品类').to_dict()['销售量(含拒退)'] # 这里需要重点理解 91 | } 92 | 93 | # 转换成 DataFrame 94 | pinlei_df = pd.DataFrame([category_data]) 95 | pinlei_df.insert(0, '日期', data_time) 96 | 97 | result_df = pd.DataFrame.from_dict([result_dict]) 98 | return result_df, pinlei_df 99 | 100 | 101 | '''多日数据分析数据库获取数据''' 102 | 103 | 104 | def Multi_data_analysis(start_data, ene_data): 105 | '''转换时间格式操作''' 106 | start_route_multi = parse_date_string(date_str=start_data) 107 | end_route_multi = parse_date_string(date_str=ene_data) 108 | '''数据库查询操作''' 109 | filtered_data = Table.query.filter( 110 | and_(Table.sale_data >= start_route_multi, Table.sale_data <= end_route_multi)).all() 111 | '''将查询到的数据进行数据匹配''' 112 | data_dict_list = [{'货号': row.produtc_code, '日期': row.sale_data, '客户数': row.customer_counts, 113 | '销售额': row.tltal_sales, '销售量(含拒退)': row.total_quantity, 114 | '销售额(扣满减含拒退)': row.sales_after_discount, 'UV': row.uv, 115 | '转化率': row.conversion_rate, '商品CTR': row.product_ctr, 116 | '曝光UV': row.exposure_uv, '款号辅助': row.style_code_auxiliary, 117 | '销售区间': row.sales_range, '品类': row.category, '活动': row.activity, 118 | '到手价': row.net_price, '到手价区间': row.net_price_range 119 | } for row in filtered_data] 120 | df = pd.DataFrame(data_dict_list) 121 | return df 122 | 123 | 124 | '''获取到的多日数据分析模块''' 125 | 126 | 127 | def multi_data_analysis_duori(data_frame): 128 | dataframe = data_frame.groupby('日期') 129 | result_list = [] # 创建一个实例用于存储迭代的数据 130 | result_list_pinlei = [] 131 | 132 | for date, group in dataframe: 133 | metrics = { 134 | '日期': group['日期'].iloc[0], 135 | '曝光UV': round(group['曝光UV'].sum(), 2), 136 | 'UV总和': group['UV'].sum(), 137 | 'CTR': round(group['UV'].sum() / group['曝光UV'].sum() * 100, 2), 138 | '客户数总和': group['客户数'].sum(), 139 | 'UV客户转化率': round((group['客户数'].sum() / group['UV'].sum()) * 100, 2), 140 | '销售额总和': group['销售额'].sum(), 141 | '销售量总和': group['销售量(含拒退)'].sum(), 142 | '平均单价': round(group['销售额'].sum() / group['销售量(含拒退)'].sum(), 2), 143 | } 144 | result_list.append(metrics) 145 | 146 | data_time = group['日期'].iloc[0] 147 | commerce_grupds = group.groupby(['品类'])['销售量(含拒退)'].sum().reset_index() # 统计每个品类的销售量 148 | commerce_grupds_sum = commerce_grupds.sum() # 销售总量 149 | result_dict = { 150 | '日期': data_time, 151 | '销售总量': commerce_grupds_sum['销售量(含拒退)'], 152 | } 153 | result_dict.update(commerce_grupds.set_index('品类').to_dict()['销售量(含拒退)']) 154 | result_list_pinlei.append(result_dict) 155 | 156 | df = pd.DataFrame(result_list) 157 | df1 = pd.DataFrame(result_list_pinlei) 158 | 159 | return df, df1 160 | 161 | -------------------------------------------------------------------------------- /core/day_danri_pyecharts.py: -------------------------------------------------------------------------------- 1 | '''单日数据可视化分析代码模块''' 2 | from pyecharts import options as opts 3 | from pyecharts.charts import Bar, Pie 4 | import pdb 5 | 6 | '''pyecharts--toolbox_opts配置参数''' 7 | 8 | toolbox_opts = { 9 | "is_show": True, # 控制工具箱是否显示 10 | "pos_left": "center", # 将工具栏放在上方中间 11 | "pos_top": "10%", # 控制工具栏的垂直位置,这里设置为距离顶部 10% 12 | "feature": { 13 | "dataZoom": {"type": "inside", "xAxisIndex": [0], "orient": "horizontal"}, # 缩放工具表示水平缩放 14 | "dataView": {"readOnly": False}, # 数据视图工具,允许用户查看和到处 15 | "magicType": {"type": ["line", "bar"]}, # 视图切换工具 16 | "restore": {}, # 图表初始话 17 | "saveAsImage": {}, # 图片保存工具 18 | }, 19 | } 20 | '''数据获取配置文件''' 21 | summ_keys = ['曝光UV总和', 'UV总和', 'CTR', '客户数总和', 'UV客户转化率', '销售额总和', '销售量总和', '平均单价'] 22 | 23 | 24 | def pyecharts_one_day(data_frame): 25 | ''' 26 | 单日数据分析可视化--整体数据分析 27 | :param data_frame: 单日数据分析数据文件 28 | :return: 29 | ''' 30 | 31 | oneday_time = data_frame['日期'].tolist() 32 | bar = ( 33 | Bar( 34 | init_opts=opts.InitOpts(chart_id='oneday_pyecharts_one') 35 | ) 36 | .add_xaxis(oneday_time) 37 | ) 38 | for col in summ_keys: 39 | bar.add_yaxis(col, data_frame[col].tolist()) 40 | bar.set_global_opts( 41 | title_opts=opts.TitleOpts( 42 | title=f"{oneday_time}日经营数据可视化", 43 | title_textstyle_opts=opts.TextStyleOpts(font_style=25), 44 | pos_right='30%', 45 | pos_top='0.1%' 46 | ), 47 | xaxis_opts=opts.AxisOpts(type_='category', name='日期'), 48 | tooltip_opts=opts.TooltipOpts(trigger='axis'), 49 | legend_opts=opts.LegendOpts(pos_right='0.01%', 50 | pos_top='12%', 51 | orient='vertical', 52 | textstyle_opts=opts.TextStyleOpts( 53 | font_size=7, 54 | ), 55 | ), 56 | datazoom_opts=opts.DataZoomOpts(is_show=True, pos_right='10%', pos_top='90%'), 57 | toolbox_opts=toolbox_opts, 58 | ) 59 | return bar 60 | 61 | 62 | ''' 经营数据附图(饼图)''' 63 | 64 | 65 | def pyecharts_one_day_pie(data_frame): 66 | ''' 67 | 68 | :param data_frame: 分析完成的数据进行数据分析 69 | :return: 70 | ''' 71 | one_pie_data = data_frame.columns[1:4] # 获取标签 72 | one_pie_values = data_frame.iloc[:, 1:4].values.tolist() # 获取数据 73 | nestd_list = [list(x) for x in zip(one_pie_data, *one_pie_values)] 74 | 75 | pie = ( 76 | Pie() 77 | .set_global_opts( 78 | title_opts=opts.TitleOpts(title="CTR数据"), 79 | legend_opts=opts.LegendOpts(orient="vertical", pos_top="0.1%", pos_left="70%"), 80 | ) 81 | .set_series_opts( 82 | label_opts=opts.LabelOpts(is_show=True), 83 | minAngle=1, 84 | radius=["40%", "80%"], 85 | minRadius=0, maxRadius=None, 86 | center=["40%", "60%"]) 87 | 88 | .add( 89 | "", 90 | (nestd_list), 91 | radius=["40%", "70%"], # 饼状图内外半径 92 | label_opts=opts.LabelOpts( 93 | position='outside', # 标签位置 94 | 95 | ), 96 | ) 97 | ) 98 | 99 | return pie 100 | 101 | 102 | '''转化率函饼形图方法''' 103 | 104 | 105 | def conversion_pie(data_frame): 106 | # 获取数据 107 | ion_list = ['UV总和', '客户数总和', 'UV客户转化率'] 108 | ion_pie_colums = data_frame.columns[data_frame.columns.isin(ion_list)] 109 | ion_pie_values = data_frame[ion_list].values.tolist() 110 | # 整理数据 111 | ion_pie_zip = [list(i) for i in zip(ion_pie_colums, *ion_pie_values)] 112 | pie = ( 113 | Pie() 114 | .set_global_opts( 115 | title_opts=opts.TitleOpts(title="转化率"), 116 | legend_opts=opts.LegendOpts(orient="vertical", pos_top="0.1%", pos_left="70%"), 117 | ) 118 | .set_series_opts( 119 | label_opts=opts.LabelOpts(is_show=True), 120 | minAngle=1, 121 | radius=["40%", "80%"], 122 | minRadius=0, maxRadius=None, 123 | center=["40%", "60%"]) 124 | 125 | .add( 126 | "", 127 | (ion_pie_zip), 128 | radius=["40%", "70%"], # 饼状图内外半径 129 | label_opts=opts.LabelOpts( 130 | position='outside', # 标签位置 131 | 132 | ), 133 | ) 134 | ) 135 | 136 | return pie 137 | 138 | 139 | '''件单价附图''' 140 | 141 | 142 | def unit_price_of_pieces(data_frame): 143 | # 获取数据 144 | unit_list = ['销售额总和', '销售量总和', '平均单价'] 145 | unit_columns = data_frame.columns[data_frame.columns.isin(unit_list)] 146 | unit_values = data_frame[unit_list].values.tolist() 147 | 148 | # 整理数据 149 | unit_zip = [list(i) for i in zip(unit_columns, *unit_values)] 150 | pie = ( 151 | Pie() 152 | .set_global_opts( 153 | title_opts=opts.TitleOpts(title="件单价"), 154 | legend_opts=opts.LegendOpts(orient="vertical", pos_top="0.1%", pos_left="70%"), 155 | ) 156 | .set_series_opts( 157 | label_opts=opts.LabelOpts(is_show=True), 158 | minAngle=1, 159 | radius=["40%", "80%"], 160 | minRadius=0, maxRadius=None, 161 | center=["40%", "60%"]) 162 | 163 | .add( 164 | "", 165 | (unit_zip), 166 | radius=["40%", "70%"], # 饼状图内外半径 167 | label_opts=opts.LabelOpts( 168 | position='outside', # 标签位置 169 | 170 | ), 171 | ) 172 | ) 173 | 174 | return pie 175 | 176 | 177 | '''ctr,转化率,件单价''' 178 | 179 | 180 | def percentage_ctr_conversion_unit(data_frame): 181 | # 获取数据 182 | percentage_list = ["CTR", "UV客户转化率", "平均单价"] 183 | percentage_columns = data_frame.columns[data_frame.columns.isin(percentage_list)] 184 | percentage_values = data_frame[percentage_list].values.tolist() 185 | # 处理数据 186 | percentage_zip = [list(i) for i in zip(percentage_columns, *percentage_values)] 187 | pie = ( 188 | Pie() 189 | .set_global_opts( 190 | title_opts=opts.TitleOpts(title="CTR,转化率,件单价"), 191 | legend_opts=opts.LegendOpts(orient="vertical", pos_top="45%", pos_left="70%"), 192 | ) 193 | .set_series_opts( 194 | label_opts=opts.LabelOpts(is_show=True), 195 | minAngle=1, 196 | radius=["40%", "80%"], 197 | minRadius=0, maxRadius=None, 198 | center=["40%", "60%"]) 199 | 200 | .add( 201 | "", 202 | (percentage_zip), 203 | radius=["40%", "70%"], # 饼状图内外半径 204 | label_opts=opts.LabelOpts( 205 | position='outside', # 标签位置 206 | 207 | ), 208 | ) 209 | ) 210 | return pie 211 | 212 | 213 | '''单日数据销售品类可视化函数''' 214 | 215 | 216 | def pyecharts_pinlei_oneday(dataframe): 217 | ''' 218 | 219 | :param dataframe: 单日销售品类数据集 220 | :return: 221 | ''' 222 | oneday_pinlei = list(dataframe.iloc[:, 1:].columns) 223 | oneday_time = dataframe['日期'].tolist() 224 | bar_pinlei = ( 225 | Bar( 226 | init_opts=opts.InitOpts(chart_id='oneday_pyecharts_one') 227 | ) 228 | .add_xaxis(oneday_time) 229 | ) 230 | for col in oneday_pinlei: 231 | bar_pinlei.add_yaxis(col, dataframe[col].tolist()) 232 | bar_pinlei.set_global_opts( 233 | title_opts=opts.TitleOpts( 234 | title=f"{oneday_time}日经品类销售数据可视化", 235 | title_textstyle_opts=opts.TextStyleOpts(font_style=25), 236 | pos_right='30%', 237 | pos_top='0.1%' 238 | ), 239 | xaxis_opts=opts.AxisOpts(type_='category', name='日期'), 240 | tooltip_opts=opts.TooltipOpts(trigger='axis'), 241 | legend_opts=opts.LegendOpts(pos_right='0.01%', 242 | pos_top='12%', 243 | orient='vertical', 244 | textstyle_opts=opts.TextStyleOpts( 245 | font_size=7, 246 | ), 247 | ), 248 | datazoom_opts=opts.DataZoomOpts(is_show=True, pos_right='10%', pos_top='90%'), 249 | toolbox_opts=toolbox_opts, 250 | ) 251 | return bar_pinlei 252 | 253 | 254 | '''单日销售品类可视化附图-pie''' 255 | 256 | 257 | def one_pinlei_pie(data_frame): 258 | # pdb.set_trace()#调试模块 259 | 260 | pinlei_df_data = data_frame[list(data_frame.iloc[:, 1:].columns)].stack().reset_index(level=0, drop=True)[ 261 | lambda x: x > 100] 262 | pinlei_df_indes = pinlei_df_data.index.tolist() 263 | pinlei_df_values = pinlei_df_data.values.tolist() 264 | pinlei_df_zip = [list(i) for i in zip(pinlei_df_indes, pinlei_df_values)] 265 | pie = ( 266 | Pie() 267 | .set_global_opts( 268 | title_opts=opts.TitleOpts(title="高于100件"), 269 | legend_opts=opts.LegendOpts(orient="vertical", pos_top="0.1%", pos_left="70%"), 270 | ) 271 | .set_series_opts( 272 | label_opts=opts.LabelOpts(is_show=True), 273 | minAngle=1, 274 | radius=["40%", "80%"], 275 | minRadius=0, maxRadius=None, 276 | center=["40%", "60%"]) 277 | 278 | .add( 279 | "", 280 | (pinlei_df_zip), 281 | radius=["40%", "70%"], # 饼状图内外半径 282 | label_opts=opts.LabelOpts( 283 | position='outside', # 标签位置 284 | 285 | ), 286 | ) 287 | ) 288 | return pie 289 | 290 | 291 | def tow_pinlei_pie(data_frame): 292 | # pdb.set_trace() # 调试模块 293 | 294 | pinlei_df_data = data_frame[list(data_frame.iloc[:, 1:].columns)].stack().reset_index(level=0, drop=True)[ 295 | lambda x: (x >= 50) & (x <= 100)] 296 | pinlei_df_index = pinlei_df_data.index.tolist() 297 | pinlei_df_values = pinlei_df_data.values.tolist() 298 | pinlei_df_zip = [list(i) for i in zip(pinlei_df_index, pinlei_df_values)] 299 | 300 | pie = ( 301 | Pie() 302 | .set_global_opts( 303 | title_opts=opts.TitleOpts(title="销售低于100件"), 304 | legend_opts=opts.LegendOpts(orient="vertical", pos_top="0.1%", pos_left="70%"), 305 | ) 306 | .set_series_opts( 307 | label_opts=opts.LabelOpts(is_show=True), 308 | minAngle=1, 309 | radius=["40%", "80%"], 310 | minRadius=0, maxRadius=None, 311 | center=["40%", "60%"]) 312 | 313 | .add( 314 | "", 315 | (pinlei_df_zip), 316 | radius=["40%", "70%"], # 饼状图内外半径 317 | label_opts=opts.LabelOpts( 318 | position='outside', # 标签位置 319 | 320 | ), 321 | ) 322 | ) 323 | return pie 324 | 325 | 326 | def three_pinlei_pie(data_frame): 327 | pinlei_df_data = data_frame[list(data_frame.iloc[:, 1:].columns)].stack().reset_index(level=0, drop=True)[ 328 | lambda x: x < 50] 329 | pinlei_df_index = pinlei_df_data.index.tolist() 330 | pinlei_df_values = pinlei_df_data.values.tolist() 331 | pinlei_df_zip_therr = [list(i) for i in zip(pinlei_df_index, pinlei_df_values)] 332 | 333 | pie = ( 334 | Pie() 335 | .set_global_opts( 336 | title_opts=opts.TitleOpts(title="销售低于50件"), 337 | legend_opts=opts.LegendOpts(orient="vertical", pos_top="0.1%", pos_left="80%"), 338 | ) 339 | .set_series_opts( 340 | label_opts=opts.LabelOpts(is_show=True), 341 | minAngle=1, 342 | radius=["40%", "80%"], 343 | minRadius=0, maxRadius=None, 344 | center=["40%", "60%"]) 345 | 346 | .add( 347 | "", 348 | (pinlei_df_zip_therr), 349 | radius=["40%", "70%"], # 饼状图内外半径 350 | label_opts=opts.LabelOpts( 351 | position='outside', # 标签位置 352 | 353 | ), 354 | ) 355 | ) 356 | return pie 357 | 358 | 359 | def four_pinlei_pie(data_frame): 360 | # pdb.set_trace() # 调试模块 361 | 362 | data_frame_columns = data_frame.iloc[:, 2:].columns.tolist() # 获取索引 363 | data_frame_amount_to = data_frame.iloc[0, 1] # 获取销售总量 364 | data_frame_values = data_frame[data_frame_columns].values.tolist() # 获取索引值 365 | data_frame_percentage = [(round((value / data_frame_amount_to) * 100, 2)) for value in data_frame_values[0]] 366 | data_frame_four_zip = [list(i) for i in zip(data_frame_columns,data_frame_percentage)] 367 | 368 | pie = ( 369 | Pie() 370 | .set_global_opts( 371 | title_opts=opts.TitleOpts(title="销售量百分比"), 372 | legend_opts=opts.LegendOpts(orient="vertical", pos_top="0.1%", pos_left="80%"), 373 | ) 374 | .set_series_opts( 375 | label_opts=opts.LabelOpts(is_show=True), 376 | minAngle=1, 377 | radius=["40%", "80%"], 378 | minRadius=0, maxRadius=None, 379 | center=["40%", "60%"]) 380 | 381 | .add( 382 | "", 383 | (data_frame_four_zip), 384 | radius=["40%", "70%"], # 饼状图内外半径 385 | label_opts=opts.LabelOpts( 386 | position='outside', # 标签位置 387 | 388 | ), 389 | ) 390 | ) 391 | return pie 392 | -------------------------------------------------------------------------------- /core/many_day_pyecharts.py: -------------------------------------------------------------------------------- 1 | '''多日数据分析可视化模块''' 2 | from pyecharts import options as opts 3 | from pyecharts.charts import Bar, Pie, Timeline 4 | from pyecharts.globals import ThemeType 5 | import pandas as pd 6 | import pdb 7 | 8 | '''globals配置文件''' 9 | toolbox_opts = { 10 | "is_show": True, # 控制工具箱是否显示 11 | "pos_left": "center", # 将工具栏放在上方中间 12 | "pos_top": "10%", # 控制工具栏的垂直位置,这里设置为距离顶部 10% 13 | "feature": { 14 | "dataZoom": {"type": "inside", "xAxisIndex": [0], "orient": "horizontal"}, # 缩放工具表示水平缩放 15 | "dataView": {"readOnly": False}, # 数据视图工具,允许用户查看和到处 16 | "magicType": {"type": ["line", "bar"]}, # 视图切换工具 17 | "restore": {}, # 图表初始话 18 | "saveAsImage": {}, # 图片保存工具 19 | }, 20 | } 21 | '''数据获取配置文件''' 22 | summ_keys = ['曝光UV', 'UV总和', 'CTR', '客户数总和', 'UV客户转化率', '销售额总和', '销售量总和', '平均单价'] 23 | 24 | '''多日经营数据柱形图可视化''' 25 | 26 | 27 | def days_pyecharts_bar(data_frame): 28 | ''' 29 | 30 | :param data_frame: 分析完成的dataframe数据集:multi_data_analysis_duori 31 | :return: 32 | ''' 33 | # pdb.set_trace() # 调试模块 34 | days_pyecharts_dataframe_time = data_frame['日期'] 35 | bar = ( 36 | Bar( 37 | init_opts=opts.InitOpts(chart_id='oneday_pyecharts_one') 38 | ) 39 | .add_xaxis([days_pyecharts_dataframe_time[i] for i in range(len(days_pyecharts_dataframe_time))]) 40 | ) 41 | for col in summ_keys: 42 | bar.add_yaxis(col, data_frame[col].tolist()) 43 | 44 | bar.set_global_opts( 45 | title_opts=opts.TitleOpts( 46 | title=f"{days_pyecharts_dataframe_time[0]}~{days_pyecharts_dataframe_time.iloc[-1]}日经营数据可视化", 47 | title_textstyle_opts=opts.TextStyleOpts(font_style=25), 48 | pos_right='30%', 49 | pos_top='0.1%' 50 | ), 51 | xaxis_opts=opts.AxisOpts(type_='category', name='日期'), 52 | tooltip_opts=opts.TooltipOpts(trigger='axis'), 53 | legend_opts=opts.LegendOpts(pos_right='0.01%', 54 | pos_top='12%', 55 | orient='vertical', 56 | textstyle_opts=opts.TextStyleOpts( 57 | font_size=7, 58 | ), 59 | ), 60 | datazoom_opts=opts.DataZoomOpts(is_show=True, pos_right='10%', pos_top='90%'), 61 | toolbox_opts=toolbox_opts, 62 | ) 63 | return bar 64 | 65 | 66 | '''经营数据附图饼数据转换方法''' 67 | 68 | 69 | def days_pyecharts_data_list(data_frame): 70 | ''' 71 | 72 | :param data_frame: 处理完成得数据[[a,1,2,3],[b,1,2,3],[c,1,2,3]] 73 | :return:[[[a,1],[b,1],[c,1]],[[a,2],[b,2],[b,3]],[[c,1],[c,2],[c,3]]] 74 | ''' 75 | columns_name = [col[0] for col in data_frame] # 获取名字 76 | values_data = [col[1:] for col in data_frame] # 获取数据 77 | transposed_data = list(map(list, zip(*values_data))) 78 | result = [[list(col) for col in zip(columns_name, row)] for row in transposed_data] 79 | return result 80 | 81 | 82 | '''经营数据附图饼形图''' 83 | 84 | 85 | def days_pyecharts_pie_ctr_business(data_frame): 86 | ''' 87 | 88 | :param data_frame: 分析完成的dataframe数据集:multi_data_analysis_duori 89 | :return: pie,t 90 | ''' 91 | # pdb.set_trace() # 调试模块 92 | days_pyecharts_dataframe_time = data_frame['日期'] 93 | days_pyecharts_dataframe_zip = [list(i) for i in zip(data_frame.loc[:, summ_keys[0:3]].columns.tolist(), 94 | *data_frame.loc[:, summ_keys[0:3]].values.tolist())] 95 | days_pyecharts_dataframe_data = days_pyecharts_data_list(data_frame=days_pyecharts_dataframe_zip) 96 | 97 | tl = ( 98 | Timeline(init_opts=opts.InitOpts( 99 | theme=ThemeType.DARK 100 | ) 101 | ) 102 | .add_schema( 103 | is_auto_play=True, 104 | play_interval=1500) 105 | ) 106 | for i in range(len(days_pyecharts_dataframe_time)): 107 | pie = ( 108 | Pie() 109 | .set_global_opts( 110 | title_opts=opts.TitleOpts( 111 | title=f"{days_pyecharts_dataframe_time[0]}~{days_pyecharts_dataframe_time.iloc[-1]}\n转化率", 112 | title_textstyle_opts=opts.TextStyleOpts(font_size=12) 113 | ), 114 | legend_opts=opts.LegendOpts(orient="vertical", pos_top="0.1%", pos_left="70%"), 115 | ) 116 | .set_series_opts( 117 | label_opts=opts.LabelOpts(is_show=True), 118 | minAngle=1, 119 | radius=["40%", "80%"], 120 | minRadius=0, maxRadius=None, 121 | center=["40%", "60%"]) 122 | 123 | .add( 124 | "", 125 | (days_pyecharts_dataframe_data[i]), 126 | radius=["40%", "70%"], # 饼状图内外半径 127 | label_opts=opts.LabelOpts( 128 | position='outside', # 标签位置 129 | 130 | ), 131 | ) 132 | ) 133 | tl.add(pie, f"{days_pyecharts_dataframe_time[i]}") 134 | return tl 135 | 136 | 137 | def days_pyecharts_pie_conversion_business(data_frame): 138 | # pdb.set_trace() # 调试模块 139 | 140 | days_conversion_time = data_frame['日期'] 141 | selected_keys = ['UV总和', '客户数总和', 'UV客户转化率'] 142 | days_conversion_zip = [list(i) for i in zip(data_frame.loc[:, selected_keys].columns.tolist(), 143 | *data_frame.loc[:, selected_keys].values.tolist())] 144 | days_pyecharts_dataframe_data = days_pyecharts_data_list(data_frame=days_conversion_zip) 145 | 146 | tl = ( 147 | Timeline(init_opts=opts.InitOpts( 148 | theme=ThemeType.DARK 149 | ) 150 | ) 151 | .add_schema( 152 | is_auto_play=True, 153 | play_interval=1500) 154 | ) 155 | for i in range(len(days_conversion_time)): 156 | pie = ( 157 | Pie() 158 | .set_global_opts( 159 | title_opts=opts.TitleOpts( 160 | title=f"{days_conversion_time[0]}~{days_conversion_time.iloc[-1]}\n转化率", 161 | title_textstyle_opts=opts.TextStyleOpts(font_size=12) 162 | ), 163 | legend_opts=opts.LegendOpts(orient="vertical", pos_top="0.1%", pos_left="70%"), 164 | ) 165 | .set_series_opts( 166 | label_opts=opts.LabelOpts(is_show=True), 167 | minAngle=1, 168 | radius=["40%", "80%"], 169 | minRadius=0, maxRadius=None, 170 | center=["40%", "60%"]) 171 | 172 | .add( 173 | "", 174 | (days_pyecharts_dataframe_data[i]), 175 | radius=["40%", "70%"], # 饼状图内外半径 176 | label_opts=opts.LabelOpts( 177 | position='outside', # 标签位置 178 | 179 | ), 180 | ) 181 | ) 182 | tl.add(pie, f"{days_conversion_time[i]}") 183 | return tl 184 | 185 | 186 | def days_pyecharts_pie_upp_business(data_frame): 187 | days_pyecharts_time = data_frame['日期'] 188 | days_pyecharts_bussiness_zip = [list(i) for i in zip(data_frame.loc[:, summ_keys[5:]].columns.tolist(), 189 | *data_frame.loc[:, summ_keys[5:]].values.tolist() 190 | )] 191 | days_pyecharts_dataframe_data = days_pyecharts_data_list(data_frame=days_pyecharts_bussiness_zip) 192 | 193 | tl = ( 194 | Timeline(init_opts=opts.InitOpts( 195 | theme=ThemeType.DARK 196 | ) 197 | ) 198 | .add_schema( 199 | is_auto_play=True, 200 | play_interval=1500) 201 | ) 202 | for i in range(len(days_pyecharts_time)): 203 | pie = ( 204 | Pie() 205 | .set_global_opts( 206 | title_opts=opts.TitleOpts( 207 | title=f"{days_pyecharts_time[0]}~{days_pyecharts_time.iloc[-1]}\n转化率", 208 | title_textstyle_opts=opts.TextStyleOpts(font_size=12) 209 | ), 210 | legend_opts=opts.LegendOpts(orient="vertical", pos_top="0.1%", pos_left="70%"), 211 | ) 212 | .set_series_opts( 213 | label_opts=opts.LabelOpts(is_show=True), 214 | minAngle=1, 215 | radius=["40%", "80%"], 216 | minRadius=0, maxRadius=None, 217 | center=["40%", "60%"]) 218 | 219 | .add( 220 | "", 221 | (days_pyecharts_dataframe_data[i]), 222 | radius=["40%", "70%"], # 饼状图内外半径 223 | label_opts=opts.LabelOpts( 224 | position='outside', # 标签位置 225 | 226 | ), 227 | ) 228 | ) 229 | tl.add(pie, f"{days_pyecharts_time[i]}") 230 | return tl 231 | 232 | 233 | def days_pyecharts_pie_cnu_business(data_frame): 234 | days_pyecharts_time = data_frame['日期'] 235 | sum_keys = ['客户数总和', 'UV客户转化率', '平均单价'] 236 | days_pyecharts_bussiness_zip = [list(i) for i in zip(data_frame.loc[:, sum_keys].columns.tolist(), 237 | *data_frame.loc[:, sum_keys].values.tolist() 238 | )] 239 | days_pyecharts_dataframe_data = days_pyecharts_data_list(data_frame=days_pyecharts_bussiness_zip) 240 | 241 | tl = ( 242 | Timeline(init_opts=opts.InitOpts( 243 | theme=ThemeType.DARK 244 | ) 245 | ) 246 | .add_schema( 247 | is_auto_play=True, 248 | play_interval=1500) 249 | ) 250 | for i in range(len(days_pyecharts_time)): 251 | pie = ( 252 | Pie() 253 | .set_global_opts( 254 | title_opts=opts.TitleOpts( 255 | title=f"{days_pyecharts_time[0]}~{days_pyecharts_time.iloc[-1]}\n转化率", 256 | title_textstyle_opts=opts.TextStyleOpts(font_size=12) 257 | ), 258 | legend_opts=opts.LegendOpts(orient="vertical", pos_top="0.1%", pos_left="70%"), 259 | ) 260 | .set_series_opts( 261 | label_opts=opts.LabelOpts(is_show=True), 262 | minAngle=1, 263 | radius=["40%", "80%"], 264 | minRadius=0, maxRadius=None, 265 | center=["40%", "60%"]) 266 | 267 | .add( 268 | "", 269 | (days_pyecharts_dataframe_data[i]), 270 | radius=["40%", "70%"], # 饼状图内外半径 271 | label_opts=opts.LabelOpts( 272 | position='outside', # 标签位置 273 | 274 | ), 275 | ) 276 | ) 277 | tl.add(pie, f"{days_pyecharts_time[i]}") 278 | return tl 279 | 280 | 281 | '''销售品类柱形图可视化方法''' 282 | 283 | 284 | def days_pyecharts_bar_category(data_frame): 285 | # pdb.set_trace() # 调试模块 286 | days_columns = list(data_frame.iloc[:, 1:].columns) 287 | days_times = data_frame['日期'] 288 | 289 | bar = ( 290 | Bar( 291 | init_opts=opts.InitOpts(chart_id='oneday_pyecharts_one') 292 | ) 293 | .add_xaxis([days_times[i] for i in range(len(days_times))]) 294 | ) 295 | for col in days_columns: 296 | bar.add_yaxis(col, data_frame[col].tolist()) 297 | 298 | bar.set_global_opts( 299 | title_opts=opts.TitleOpts( 300 | title=f"{days_times[0]}~{days_times.iloc[-1]}日经品类销售可视化", 301 | title_textstyle_opts=opts.TextStyleOpts(font_style=25), 302 | pos_right='30%', 303 | pos_top='0.1%' 304 | ), 305 | xaxis_opts=opts.AxisOpts(type_='category', name='日期'), 306 | tooltip_opts=opts.TooltipOpts(trigger='axis'), 307 | legend_opts=opts.LegendOpts(pos_right='0.01%', 308 | pos_top='12%', 309 | orient='vertical', 310 | textstyle_opts=opts.TextStyleOpts( 311 | font_size=7, 312 | ), 313 | ), 314 | datazoom_opts=opts.DataZoomOpts(is_show=True, pos_right='10%', pos_top='90%'), 315 | toolbox_opts=toolbox_opts, 316 | ) 317 | return bar 318 | 319 | 320 | '''销售品类可视化附图饼形图''' 321 | 322 | 323 | def dyas_pyecharts_pie_categouy_onehunderd(data_frame): 324 | # pdb.set_trace() # 调试模块 325 | days_times = data_frame['日期'] 326 | categouy_df_data = data_frame.iloc[:, 1:].stack()[lambda x: x > 100].reset_index() 327 | result = categouy_df_data.groupby('level_0').apply(lambda x: x[['level_1', 0]].values.tolist()).tolist() 328 | 329 | tl = ( 330 | Timeline(init_opts=opts.InitOpts( 331 | theme=ThemeType.DARK 332 | ) 333 | ) 334 | .add_schema( 335 | is_auto_play=True, 336 | play_interval=1500) 337 | ) 338 | for i in range(len(days_times)): 339 | pie = ( 340 | Pie() 341 | .set_global_opts( 342 | title_opts=opts.TitleOpts( 343 | title=f"{days_times[0]}~{days_times.iloc[-1]}\n大于100件", 344 | title_textstyle_opts=opts.TextStyleOpts(font_size=12) 345 | ), 346 | legend_opts=opts.LegendOpts(orient="vertical", pos_top="0.1%", pos_left="70%"), 347 | ) 348 | .set_series_opts( 349 | label_opts=opts.LabelOpts(is_show=True), 350 | minAngle=1, 351 | radius=["40%", "80%"], 352 | minRadius=0, maxRadius=None, 353 | center=["40%", "60%"]) 354 | 355 | .add( 356 | "", 357 | (result[i]), 358 | radius=["40%", "70%"], # 饼状图内外半径 359 | label_opts=opts.LabelOpts( 360 | position='outside', # 标签位置 361 | 362 | ), 363 | ) 364 | ) 365 | tl.add(pie, f"{days_times[i]}") 366 | return tl 367 | 368 | 369 | def dyas_pyecharts_pie_categouy_towhunderd(data_frame): 370 | # pdb.set_trace() # 调试模块 371 | days_times = data_frame['日期'] 372 | categouy_df_data = data_frame.iloc[:, 1:].stack()[lambda x: (x >= 50) & (x <= 100)].reset_index() 373 | result = categouy_df_data.groupby('level_0').apply(lambda x: x[['level_1', 0]].values.tolist()).tolist() 374 | tl = ( 375 | Timeline(init_opts=opts.InitOpts( 376 | theme=ThemeType.DARK 377 | ) 378 | ) 379 | .add_schema( 380 | is_auto_play=True, 381 | play_interval=1500) 382 | ) 383 | for i in range(len(days_times)): 384 | pie = ( 385 | Pie() 386 | .set_global_opts( 387 | title_opts=opts.TitleOpts( 388 | title=f"{days_times[0]}~{days_times.iloc[-1]}\n小于100大于50", 389 | title_textstyle_opts=opts.TextStyleOpts(font_size=12) 390 | ), 391 | legend_opts=opts.LegendOpts(orient="vertical", pos_top="0.1%", pos_left="70%"), 392 | ) 393 | .set_series_opts( 394 | label_opts=opts.LabelOpts(is_show=True), 395 | minAngle=1, 396 | radius=["40%", "80%"], 397 | minRadius=0, maxRadius=None, 398 | center=["40%", "60%"]) 399 | 400 | .add( 401 | "", 402 | (result[i]), 403 | radius=["40%", "70%"], # 饼状图内外半径 404 | label_opts=opts.LabelOpts( 405 | position='outside', # 标签位置 406 | 407 | ), 408 | ) 409 | ) 410 | tl.add(pie, f"{days_times[i]}") 411 | return tl 412 | 413 | 414 | def dyas_pyecharts_pie_categouy_threehunderd(data_frame): 415 | # pdb.set_trace() # 调试模块 416 | days_times = data_frame['日期'] 417 | categouy_df_data = data_frame.iloc[:, 1:].stack()[lambda x: x < 50].reset_index() 418 | result = categouy_df_data.groupby('level_0').apply(lambda x: x[['level_1', 0]].values.tolist()).tolist() 419 | 420 | tl = ( 421 | Timeline(init_opts=opts.InitOpts( 422 | theme=ThemeType.DARK 423 | ) 424 | ) 425 | .add_schema( 426 | is_auto_play=True, 427 | play_interval=1500) 428 | ) 429 | for i in range(len(days_times)): 430 | pie = ( 431 | Pie() 432 | .set_global_opts( 433 | title_opts=opts.TitleOpts( 434 | title=f"{days_times[0]}~{days_times.iloc[-1]}\n小于50", 435 | title_textstyle_opts=opts.TextStyleOpts(font_size=12) 436 | ), 437 | legend_opts=opts.LegendOpts(orient="vertical", pos_top="0.1%", pos_left="70%"), 438 | ) 439 | .set_series_opts( 440 | label_opts=opts.LabelOpts(is_show=True), 441 | minAngle=1, 442 | radius=["40%", "80%"], 443 | minRadius=0, maxRadius=None, 444 | center=["40%", "60%"]) 445 | 446 | .add( 447 | "", 448 | (result[i]), 449 | radius=["40%", "70%"], # 饼状图内外半径 450 | label_opts=opts.LabelOpts( 451 | position='outside', # 标签位置 452 | 453 | ), 454 | ) 455 | ) 456 | tl.add(pie, f"{days_times[i]}") 457 | return tl 458 | 459 | 460 | def dyas_pyecharts_pie_categouy_fourhunderd(data_frame): 461 | # pdb.set_trace() # 调试模块 462 | days_times = data_frame['日期'] 463 | categouy_df_data = data_frame.columns[1:] # 除去日期列 464 | data_frame[categouy_df_data] = (data_frame[categouy_df_data].div(data_frame['销售总量'], axis=0) * 100).round( 465 | 2) # 计算百分比 466 | data_frame_zip = data_frame.iloc[:, 2:].stack().reset_index() # 对数据进行打标为数据分组做数据准备 467 | 468 | data_frame_list = data_frame_zip.groupby('level_0').apply( 469 | lambda x: x[['level_1', 0]].values.tolist()).tolist() # 完成数据是一个嵌套列表类数据 470 | 471 | tl = ( 472 | Timeline(init_opts=opts.InitOpts( 473 | theme=ThemeType.DARK 474 | ) 475 | ) 476 | .add_schema( 477 | is_auto_play=True, 478 | play_interval=1500) 479 | ) 480 | for i in range(len(days_times)): 481 | pie = ( 482 | Pie() 483 | .set_global_opts( 484 | title_opts=opts.TitleOpts( 485 | title=f"{days_times[0]}~{days_times.iloc[-1]}\n销售量百分比", 486 | title_textstyle_opts=opts.TextStyleOpts(font_size=12) 487 | ), 488 | legend_opts=opts.LegendOpts(orient="vertical", pos_top="0.1%", pos_left="80%", 489 | textstyle_opts=opts.TextStyleOpts(font_size=12)) 490 | ) 491 | .set_series_opts( 492 | label_opts=opts.LabelOpts(is_show=True), 493 | minAngle=1, 494 | radius=["40%", "80%"], 495 | minRadius=0, maxRadius=None, 496 | center=["40%", "60%"]) 497 | 498 | .add( 499 | "", 500 | (data_frame_list[i]), 501 | radius=["40%", "70%"], # 饼状图内外半径 502 | label_opts=opts.LabelOpts( 503 | position='outside', # 标签位置 504 | 505 | ), 506 | ) 507 | ) 508 | tl.add(pie, f"{days_times[i]}") 509 | return tl 510 | -------------------------------------------------------------------------------- /core/models.py: -------------------------------------------------------------------------------- 1 | from flask_login import UserMixin 2 | from werkzeug.security import check_password_hash, generate_password_hash 3 | from core import db 4 | 5 | '''数据库注册''' 6 | 7 | 8 | class Admin(db.Model, UserMixin): 9 | __tablename__ = 'flask_analysis_admin' 10 | id = db.Column(db.Integer, primary_key=True) 11 | name = db.Column(db.String(255)) 12 | password = db.Column(db.String(255)) 13 | flasktime = db.Column(db.DateTime) 14 | 15 | def set_pwd(self, mpassword): # 密码加密函数 16 | self.password = generate_password_hash(mpassword) 17 | 18 | def validate_pwd(self, ypassword): # 密码解密函数 19 | return check_password_hash(self.password, ypassword) 20 | 21 | 22 | '''电商数据表格数据组orm''' 23 | 24 | 25 | class Table(db.Model): 26 | __tablename__ = 'flask_analysis_biaoge' 27 | id = db.Column(db.Integer, primary_key=True) # id 自增 28 | produtc_code = db.Column(db.String(255), nullable=True) # 货号 29 | sale_data = db.Column(db.DateTime, nullable=True) # 销售日期 30 | customer_counts = db.Column(db.Integer, nullable=True) # 客户数 31 | tltal_sales = db.Column(db.Float, nullable=True) # 销售额 32 | total_quantity = db.Column(db.Integer, nullable=True) # 销售量 33 | sales_after_discount = db.Column(db.Float, nullable=True) # 销售额含满减拒退 34 | uv = db.Column(db.Integer, nullable=True) # uv 35 | conversion_rate = db.Column(db.Float, nullable=True) # 转化率 36 | product_ctr = db.Column(db.Float, nullable=True) # 商品ctr 37 | exposure_uv = db.Column(db.Float, nullable=True) # 曝光uv 38 | style_code_auxiliary = db.Column(db.String(255), nullable=True) # 款号辅助 39 | sales_range = db.Column(db.String(255), nullable=True) # 销售区间 40 | category = db.Column(db.String(255), nullable=True) # 品类 41 | activity = db.Column(db.String(255), nullable=True) # 活动 42 | net_price = db.Column(db.Float, nullable=True) # 到手价 43 | net_price_range = db.Column(db.String(255), nullable=True) # 到手价区间 44 | -------------------------------------------------------------------------------- /core/static/css/analysis.css: -------------------------------------------------------------------------------- 1 | .analysis-div{ 2 | display: fiex; 3 | flex-direction: column; 4 | justify-content: center; 5 | height: 20vh; 6 | margin-top: -335px; 7 | } 8 | 9 | .analysis_div_button { 10 | position: relative; 11 | } 12 | 13 | .analysis-table-container { 14 | position: absolute; 15 | top: -74px; 16 | left: 1px; 17 | z-index: 1; 18 | } 19 | .table-striped { 20 | border-collapse: collapse; 21 | width: 198%; 22 | border: 24px solid #ccc; 23 | } 24 | 25 | .table-striped2{ 26 | border-collapse: collapse; 27 | width: 198%; 28 | border: 53px solid #ccc; 29 | } 30 | 31 | .analysis_div_h3 { 32 | position: absolute; /* 调整上边距,使其在表格下方 */ 33 | top:-120px; 34 | right: 47%; 35 | } 36 | 37 | .analysis-clost-button { 38 | position: absolute; 39 | top: -98px; /* 调整按钮距离顶部的位置 */ 40 | right: 10px; /* 调整按钮距离右侧的位置 */ 41 | } 42 | 43 | .analysis-table-containers { 44 | position: absolute; 45 | top: -74px; 46 | left: 1px; 47 | z-index: 1; 48 | } 49 | -------------------------------------------------------------------------------- /core/static/css/base.css: -------------------------------------------------------------------------------- 1 | /* 图片信息传入 */ 2 | body{ 3 | background-image: url('../image/base.png'); 4 | background-repeat: no-repeat; 5 | backround-size: 450px,300px; 6 | background-position: 750px 125px; 7 | } 8 | /* 网站头部header中的css设定 */ 9 | 10 | .base-herder-div { 11 | background-color: #6f068bad; /* 背景颜色 */ 12 | color: #fff; /* 文字颜色 */ 13 | padding: 10px; /* 内边距 */ 14 | display: flex; /* 使用 Flexbox 布局 */ 15 | justify-content: space-between; /* 左右对齐 */ 16 | align-items: center; /* 垂直居中 */ 17 | } 18 | 19 | header { 20 | font-size: 30px; /* 标题文字大小 */ 21 | } 22 | 23 | .base-logout { 24 | background-color: #fff; /* 按钮背景颜色 */ 25 | color: #007bff; /* 按钮文字颜色 */ 26 | border: none; /* 移除按钮边框 */ 27 | padding: 10px 20px; /* 按钮内边距 */ 28 | cursor: pointer; 29 | transition: background-color 0.3s, color 0.3s; /* 添加背景和文字颜色过渡效果 */ 30 | } 31 | 32 | .base-logout:hover { 33 | background-color: #007bff; /* 鼠标悬停时的背景颜色 */ 34 | color: #fff; /* 鼠标悬停时的文字颜色 */ 35 | } 36 | 37 | 38 | /* 导航栏css设定 */ 39 | .base-div-nav { 40 | background-color:#e0e0e0; 41 | display: flex; /* 使用 Flexbox 布局 */ 42 | margin-left: 0%; 43 | width:100%; 44 | height: 60px; 45 | margin-top:0px; 46 | } 47 | 48 | .base-nav{ 49 | padding: 0px; 50 | margin-left:28%; 51 | height:95%; 52 | width:42%; 53 | } 54 | 55 | .base-nav-ul { 56 | list-style-type: none; 57 | padding: 0; 58 | display: flex; 59 | justify-content: center; /* 使用justify-content来水平居中 */ 60 | position: relative; /* 用于定位伪元素 */ 61 | padding-left: 30px; /* 为伪元素留出空间 */ 62 | margin-right: 30px; 63 | } 64 | 65 | .base-nav-ul li { 66 | margin-right: 40px; /* 可以根据需要设置间距 */ 67 | position: relative; 68 | margin-right: 30px; 69 | padding-left: 30px; 70 | cursor: pointer; 71 | } 72 | 73 | .base-nav-ul li:last-child { 74 | margin-right: 0; 75 | } 76 | 77 | .base-nav-ul li::before { 78 | content: '\2713'; 79 | position: absolute; 80 | left: 0; 81 | top: 50%; 82 | transform: translateY(-50%); 83 | font-size: 18px; 84 | color: transparent; /* 初始状态下透明 */ 85 | transition: color 0.3s; /* 添加颜色过渡效果 */ 86 | 87 | } 88 | 89 | .base-nav-ul li:hover::before { 90 | color: #007bff; /* 鼠标悬停时的颜色 */ 91 | } 92 | 93 | /* 网站底部设定 */ 94 | 95 | footer { 96 | position: fixed; /* 使用固定定位 */ 97 | bottom: 0; /* 位于页面底部 */ 98 | left: 0; /* 左侧对齐 */ 99 | width: 100%; /* 宽度占满整个屏幕 */ 100 | color: #fff; /* 文字颜色 */ 101 | padding: 10px; /* 内边距 */ 102 | text-align: center; /* 文本居中对齐 */ 103 | } 104 | 105 | /* h1标签css设定 */ 106 | .base-div-h{ 107 | width:39%; 108 | margin-top:10%; 109 | text-align: center; 110 | } 111 | 112 | /* 屏幕适配 */ 113 | .some-element { 114 | /* 默认样式 */ 115 | } 116 | 117 | /* 在小屏幕上修改样式 */ 118 | @media (max-width: 768px) { 119 | .some-element { 120 | /* 修改样式以适应小屏幕 */ 121 | } 122 | } 123 | 124 | 125 | -------------------------------------------------------------------------------- /core/static/css/logins.css: -------------------------------------------------------------------------------- 1 | body { 2 | background-image: url("../image/loging22.jpg"); /* 设置背景图片 再次出发,向心而行,致敬奔腾不息的力量*/ 3 | background-size: cover; /* 设置背景图片大小适应容器 */ 4 | } 5 | header { 6 | text-align: center; 7 | color: white; 8 | font-size: 15px; 9 | font-weight: bold; 10 | letter-spacing: 10px; 11 | text-transform: uppercase; 12 | background-size: cover; 13 | background-position: center; 14 | } 15 | 16 | .dody_login_id { 17 | height: 100%; 18 | display: flex; 19 | flex-wrap: wrap; 20 | justify-content: center; 21 | align-items: center; 22 | flex-direction: column; 23 | } 24 | 25 | 26 | .container { 27 | width: 13%; 28 | transform: translate(-60%, 50%); 29 | margin: auto; 30 | height: 201px; 31 | background-color: transparent; 32 | color: rgba(255, 255, 255, 1); 33 | opacity: 0.5; 34 | padding: 47px; 35 | box-shadow: 11px -9px 18px #536; 36 | } 37 | 38 | 39 | .login_hid { 40 | text-align: left; 41 | margin-bottom: -67px; 42 | font-size: 29px; 43 | line-height: 2.2; 44 | position: absolute; 45 | top: 4%; 46 | transform: translateY(-52%); 47 | } 48 | 49 | .lagin_form_id{ 50 | 51 | 52 | } 53 | 54 | label { 55 | display: block; /* 设置标签为块级元素 */ 56 | margin-bottom: 10px; /* 底部外边距为10px */ 57 | } 58 | 59 | input[type="text"], input[type="password"] { 60 | display: block; /* 设置输入框为块级元素 */ 61 | width: 100%; /* 设置输入框宽度为100% */ 62 | padding: 10px; /* 设置输入框内边距为10px */ 63 | margin-bottom: 20px; /* 底部外边距为20px */ 64 | border-radius: 5px; /* 设置输入框圆角 */ 65 | border: none; /* 去掉输入框边框 */ 66 | } 67 | 68 | button { 69 | background-color: #4CAF50; /* 设置按钮背景颜色为绿色 70 | color: #fff; /* 设置按钮文字颜色 */ 71 | padding: 10px 20px; /* 设置按钮内边距 */ 72 | border-radius: 5px; /* 设置按钮圆角 */ 73 | border: none; /* 去掉按钮边框 */ 74 | cursor: pointer; /* 设置鼠标悬停样式 */ 75 | } 76 | 77 | button:hover { 78 | background-color: #388E3C; /* 设置鼠标悬停时按钮背景颜色为深绿色 */ 79 | } -------------------------------------------------------------------------------- /core/static/css/query.css: -------------------------------------------------------------------------------- 1 | .query-div-data{ 2 | display: flex; 3 | flex-direction: column; 4 | justify-content: center; 5 | align-items: center; 6 | height: 20vh; 7 | margin-top: -415px; 8 | } 9 | 10 | .query-div-button1{ 11 | margin-left: -22%; 12 | margin-top: 19%; 13 | } 14 | 15 | /*表格图层内容*/ 16 | .table-container { 17 | /* 表格容器样式 */ 18 | width: 100%; 19 | overflow: auto; /* 如果表格太大,启用滚动条 */ 20 | } 21 | 22 | .overlay { 23 | /* 图层样式 */ 24 | position: absolute; 25 | top: 0; 26 | left: 0; 27 | width: 100%; 28 | height: 100%; 29 | background-color: rgba(0, 0, 0, 0.5); /* 半透明背景 */ 30 | display: none; /* 初始隐藏图层 */ 31 | } 32 | 33 | /* 表格滚动设定*/ 34 | .file-list { 35 | max-height: 650px; /* 设置滚动容器的最大高度,可以根据需要调整 */ 36 | overflow: auto; /* 启用滚动条 */ 37 | position:absolute; 38 | top:215px; 39 | left:91px; 40 | z-index:999; 41 | } 42 | /*表格美化css*/ 43 | .table { 44 | border-collapse: collapse; 45 | width: 100%; 46 | border:1px solid #ccc; 47 | } 48 | 49 | /* 设置表头的背景颜色 */ 50 | .table th { 51 | background-color: #f0f0f0; /* 表头背景颜色 */ 52 | } 53 | 54 | /* 设置表格内容的背景颜色 */ 55 | .table tbody tr:nth-child(odd) { 56 | background-color: #f2f2f2; /* 交替行的背景颜色 */ 57 | } 58 | 59 | /* 设置表格内容的另一种背景颜色 */ 60 | .table tbody tr:nth-child(even) { 61 | background-color: #e0e0e0; /* 交替行的背景颜色 */ 62 | } 63 | 64 | 65 | /* 添加悬停效果 */ 66 | .table-hover tbody tr:hover { 67 | background-color: #e0e0e0; /* 悬停行的背景颜色 */ 68 | } 69 | 70 | .table th, .table td { 71 | border: 1px solid #ccc; /* 添加单元格边框 */ 72 | padding: 8px; 73 | text-align: center; 74 | } 75 | .table thead th{ 76 | position: sticky; 77 | top: 0; /* 表头固定在顶部 */ 78 | z-index: 1; /* 确保表头位于其他内容之上 */ 79 | } 80 | -------------------------------------------------------------------------------- /core/static/css/visualization.css: -------------------------------------------------------------------------------- 1 | /* 头部*/ 2 | 3 | .vis-analysis-div-button{ 4 | position: relative; 5 | } 6 | 7 | /* 关闭按键 */ 8 | 9 | .vis-analysis-clost-button{ 10 | position: absolute; 11 | top: 267px; /* 调整按钮距离顶部的位置 */ 12 | right: 10px; /* 调整按钮距离右侧的位置 */ 13 | } 14 | 15 | /* 图表显示容器 */ 16 | 17 | vis-analysis-table-container{ 18 | position: absolute; 19 | top: 267px; 20 | left: 1px; 21 | z-index: 1; 22 | } 23 | /* h3标题 */ 24 | 25 | .vis-analysis_div_h3{ 26 | position: absolute; /* 调整上边距,使其在表格下方 */ 27 | top: 267px; 28 | right: 47%; 29 | } 30 | 31 | 32 | /*品类可视化显示*/ 33 | .analysis-pytcharts-pl { 34 | background-color: white; /* 设置背景颜色为白色 */ 35 | position: relative; /* 使用相对定位 */ 36 | top: -20px; /* 顶部间距 */ 37 | left: 0px; /* 左边间距 */ 38 | } 39 | 40 | 41 | .analysis-pytcharts-jy { 42 | background-color: white; /* 设置背景颜色为白色 */ 43 | position: relative; /* 使用相对定位 */ 44 | top: -17px; /* 顶部间距 */ 45 | left: 0px; /* 左边间距 */ 46 | } 47 | 48 | /* 单日经营数据饼形图1*/ 49 | .analysis-pytcharts-jy_pie1{ 50 | background-color: white; /* 设置背景颜色为白色 */ 51 | position: relative; /* 使用相对定位 */ 52 | top: -819px; /* 顶部间距 */ 53 | left: 917px; /* 左边间距 */ 54 | } 55 | 56 | .analysis-pytcharts-jy_pie2{ 57 | background-color: white; /* 设置背景颜色为白色 */ 58 | position: relative; /* 使用相对定位 */ 59 | top: -981px; /* 顶部间距 */ 60 | left: 1412px; /* 左边间距 */ 61 | } 62 | .analysis-pytcharts-jy-pie3{ 63 | background-color: white; /* 设置背景颜色为白色 */ 64 | position: relative; /* 使用相对定位 */ 65 | top: -974px; /* 顶部间距 */ 66 | left: 917px; /* 左边间距 */ 67 | } 68 | .analysis-pytcharts-jy-pie4{ 69 | background-color: white; /* 设置背景颜色为白色 */ 70 | position: relative; /* 使用相对定位 */ 71 | top: -1134px; /* 顶部间距 */ 72 | left: 1412px; /* 左边间距 */ 73 | } 74 | .analysis-pytcharts-pl-pie1{ 75 | background-color: white; /* 设置背景颜色为白色 */ 76 | position: relative; /* 使用相对定位 */ 77 | top: -1062px; /* 顶部间距 */ 78 | left: 903px; /* 左边间距 */ 79 | } 80 | .analysis-pytcharts-pl-pie2{ 81 | background-color: white; /* 设置背景颜色为白色 */ 82 | position: relative; /* 使用相对定位 */ 83 | top: -1020px; /* 顶部间距 */ 84 | left: 903px; /* 左边间距 */ 85 | } 86 | 87 | .analysis-pytcharts-pl-pie3{ 88 | background-color: white; /* 设置背景颜色为白色 */ 89 | position: relative; /* 使用相对定位 */ 90 | top: -1392px; /* 顶部间距 */ 91 | left: 1413px; /* 左边间距 */ 92 | } 93 | 94 | .analysis-pytcharts-pl-pie4{ 95 | background-color: white; /* 设置背景颜色为白色 */ 96 | position: relative; /* 使用相对定位 */ 97 | top: -1339px; /* 顶部间距 */ 98 | left: 1413px; /* 左边间距 */ 99 | } 100 | 101 | .analysis-pytcharts-business{ 102 | background-color: white; /* 设置背景颜色为白色 */ 103 | position: relative; /* 使用相对定位 */ 104 | top: -17px; /* 顶部间距 */ 105 | left: 0px; /* 左边间距 */ 106 | } 107 | 108 | .analysis-pytcharts-business_pie_one{ 109 | background-color: white; /* 设置背景颜色为白色 */ 110 | position: relative; /* 使用相对定位 */ 111 | top: -417px; /* 顶部间距 */ 112 | left: 917px; /* 左边间距 */ 113 | } 114 | 115 | .analysis-pytcharts-business_pie_tow{ 116 | background-color: white; /* 设置背景颜色为白色 */ 117 | position: relative; /* 使用相对定位 */ 118 | top: -616px; /* 顶部间距 */ 119 | left: 1412px; /* 左边间距 */ 120 | } 121 | 122 | .analysis-pytcharts-business_pie_three{ 123 | background-color: white; /* 设置背景颜色为白色 */ 124 | position: relative; /* 使用相对定位 */ 125 | top: -614px; /* 顶部间距 */ 126 | left: 917px; /* 左边间距 */ 127 | } 128 | 129 | .analysis-pytcharts-business_pie_four{ 130 | background-color: white; /* 设置背景颜色为白色 */ 131 | position: relative; /* 使用相对定位 */ 132 | top: -811px; /* 顶部间距 */ 133 | left: 1412px; /* 左边间距 */ 134 | } 135 | 136 | .analysis-pytcharts-category{ 137 | background-color: white; /* 设置背景颜色为白色 */ 138 | position: relative; /* 使用相对定位 */ 139 | top: -728px; /* 顶部间距 */ 140 | left: 0px; /* 左边间距 */ 141 | } 142 | 143 | .analysis-pytcharts-category-one{ 144 | background-color: white; /* 设置背景颜色为白色 */ 145 | position: relative; /* 使用相对定位 */ 146 | top: -1164px; /* 顶部间距 */ 147 | left: 903px; /* 左边间距 */ 148 | } 149 | 150 | .analysis-pytcharts-category-tow{ 151 | background-color: white; /* 设置背景颜色为白色 */ 152 | position: relative; /* 使用相对定位 */ 153 | top: -1428px; /* 顶部间距 */ 154 | left: 1411px; /* 左边间距 */ 155 | } 156 | 157 | .analysis-pytcharts-category-three{ 158 | background-color: white; /* 设置背景颜色为白色 */ 159 | position: relative; /* 使用相对定位 */ 160 | top: -1417px; /* 顶部间距 */ 161 | left: 901px; /* 左边间距 */ 162 | } 163 | 164 | .analysis-pytcharts-category-four{ 165 | background-color: white; /* 设置背景颜色为白色 */ 166 | position: relative; /* 使用相对定位 */ 167 | top: -1682px; /* 顶部间距 */ 168 | left: 1413px; /* 左边间距 */ 169 | } -------------------------------------------------------------------------------- /core/static/image/120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/core/static/image/120.png -------------------------------------------------------------------------------- /core/static/image/121.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/core/static/image/121.png -------------------------------------------------------------------------------- /core/static/image/122.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/core/static/image/122.png -------------------------------------------------------------------------------- /core/static/image/123.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/core/static/image/123.png -------------------------------------------------------------------------------- /core/static/image/124.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/core/static/image/124.png -------------------------------------------------------------------------------- /core/static/image/base.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/core/static/image/base.png -------------------------------------------------------------------------------- /core/static/image/dlbjt.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/core/static/image/dlbjt.jpg -------------------------------------------------------------------------------- /core/static/image/loging22.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/core/static/image/loging22.jpg -------------------------------------------------------------------------------- /core/static/image/选择文件.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/core/static/image/选择文件.png -------------------------------------------------------------------------------- /core/static/js/analysis.js: -------------------------------------------------------------------------------- 1 | 2 | // 获取分析类型下拉框和日期输入框元素 3 | var analysisTypeDropdown = document.getElementById("analysis_type"); 4 | var singleDayInput = document.getElementById("single_day_input"); 5 | var multiDayInput = document.getElementById("multi_day_input"); 6 | 7 | // 添加事件监听器,根据用户选择显示或隐藏日期输入框 8 | analysisTypeDropdown.addEventListener("change", function () { 9 | if (analysisTypeDropdown.value === "single_day") { 10 | singleDayInput.style.display = "block"; 11 | multiDayInput.style.display = "none"; 12 | } else if (analysisTypeDropdown.value === "multi_day") { 13 | singleDayInput.style.display = "none"; 14 | multiDayInput.style.display = "block"; 15 | } else { 16 | singleDayInput.style.display = "none"; 17 | multiDayInput.style.display = "none"; 18 | } 19 | }); 20 | function showTable() { 21 | var tableContainer = document.querySelector('.analysis-table-container'); 22 | var closeButton = document.querySelector('.analysis-clost-button'); 23 | var h3Element = document.querySelector('.analysis_div_h3'); 24 | var analysisTypeDropdown = document.getElementById("analysis_type"); 25 | 26 | // 显示表格 27 | tableContainer.style.display = 'block'; 28 | 29 | // 显示按钮 30 | closeButton.style.display = 'block'; 31 | 32 | // 根据用户选择的分析类型来显示或隐藏H3标题 33 | if (analysisTypeDropdown.value === "single_day" || analysisTypeDropdown.value === "multi_day") { 34 | h3Element.style.display = 'block'; 35 | } else { 36 | h3Element.style.display = 'none'; 37 | } 38 | } 39 | 40 | // 调用showTable函数以显示表格及相关元素 41 | showTable(); 42 | 43 | function closeFileList() { 44 | var fileList = document.querySelector('.analysis_div_button'); 45 | fileList.style.display = 'none'; 46 | var closeButton = document.querySelector('.analysis-clost-button'); 47 | closeButton.style.display = 'block'; 48 | // 清除 div 元素中的内容 49 | fileList.innerHTML = ''; 50 | } -------------------------------------------------------------------------------- /core/static/js/query.js: -------------------------------------------------------------------------------- 1 | function closeFileList() { 2 | var fileList = document.querySelector('.file-list'); 3 | fileList.style.display = 'none'; 4 | var closeButton = document.querySelector('.close-button'); 5 | closeButton.style.display = 'block'; 6 | // 清除 div 元素中的内容 7 | fileList.innerHTML = ''; 8 | } -------------------------------------------------------------------------------- /core/templates/analysis.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | 3 | {% block content %} 4 |
5 |
6 |
7 |

选择分析类型:

8 | 9 | 13 | 14 | 15 | 19 | 20 | 21 | 27 | 28 | 29 |
30 |
31 |
32 | 33 |
34 | 35 | 36 |
37 | {% if html_table_display and html_table_display_pinlei %} 38 | {{ html_table_display|safe }} 39 | {{ html_table_display_pinlei|safe }} 40 | {% endif %} 41 |
42 | 43 |
44 | {% if html_table_display_duori %} 45 | {{ html_table_display_duori|safe }} 46 | {{ html_table_display_duori_pinlei|safe }} 47 | {% endif %} 48 |
49 |
50 | 51 | 94 | {% endblock %} 95 | -------------------------------------------------------------------------------- /core/templates/base.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 电商数据分析可视化平台 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 |
19 | 电商经营数据可视化管理系统 20 |
21 | 22 |
23 |
24 | 25 |
26 |
27 | 28 |
29 |
30 | 38 |
39 |
40 |

41 | 欢迎光临电商数据分析系统,您的线上电商数据可视化利器! 42 |

43 |

如果你对可视化没有创意请点击这里 44 | 点击这里

45 |
46 |
47 | 51 |
52 | {% block content %} 53 | 54 | {% endblock %} 55 | 56 | -------------------------------------------------------------------------------- /core/templates/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Title 6 | 7 | 8 |

{{ flash_sx }}

9 |

点击返回登录界面

10 | 11 | 12 | -------------------------------------------------------------------------------- /core/templates/login.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 |

电商经营数据可视化管理系统

12 |
13 | 14 |
15 | 山峰为伴,重新出发,致敬奔腾不息的力量 16 | ——题记 17 |
18 | 19 |
20 | 21 |

22 | 登录 23 |

24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
32 | 33 |

注册工作人员 34 | 注册 35 |

36 |
37 | 38 | 39 | -------------------------------------------------------------------------------- /core/templates/query.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | 3 | {% block content %} 4 |
5 |
6 |
7 | 8 | 9 | 10 |
11 |
12 |
13 | 14 |
15 | 16 | {{ html_table_display|safe }} 17 |
18 | 19 | {% endblock %} -------------------------------------------------------------------------------- /core/templates/register.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 |

用户注册

13 |
14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 |
22 |
23 | 24 | -------------------------------------------------------------------------------- /core/templates/visualization.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | 3 | {% block content %} 4 |
5 |
6 |
7 |

选择选择可视化类型:

8 | 9 | 13 | 14 | 15 | 19 | 20 | 21 | 27 | 28 | 29 |
30 |
31 |
32 | 33 | 34 | 35 |
36 | 37 | 38 |
39 | 40 | {% if pyecharts_bar_chart_html and pyecharts_bar_chart_pinlei_html %} 41 | 42 |

{{ analysis_route_single }}数据可视化大屏

43 | 44 |
45 |
46 | 47 |
48 |
49 |
50 |
51 | 52 | 53 |
54 |
55 |
56 |
57 | 58 | 122 | 123 | {% elif pyecharts_days_bar_business %} 124 |

{{ analysis_route_multi_start }}~{{ analysis_route_multi_end }}数据可视化

125 | 126 |
127 |
128 |
129 |
130 |
131 | 132 |
133 | 134 |
135 |
136 |
137 |
138 | 139 | 201 | 202 | {% endif %} 203 |
204 | 205 |
206 | 207 | 248 | 249 | 250 | {% endblock %} 251 | 252 | 253 | -------------------------------------------------------------------------------- /core/utility.py: -------------------------------------------------------------------------------- 1 | import time 2 | from datetime import datetime 3 | 4 | 5 | class Utility: 6 | @classmethod 7 | def get_cur_time(cls): 8 | return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) 9 | 10 | 11 | '''字符串转日期格式''' 12 | 13 | 14 | def parse_date_string(date_str, format='%Y-%m-%d'): 15 | date_obj = datetime.strptime(date_str, format) 16 | return date_obj 17 | -------------------------------------------------------------------------------- /core/views.py: -------------------------------------------------------------------------------- 1 | '''web程序flask路由文件''' 2 | from core import app, db 3 | from core.utility import Utility 4 | from core.models import Admin, Table 5 | from flask_login import login_user 6 | from flask import render_template, request, url_for, redirect, flash 7 | 8 | from core.data_fenxi import commerce, get_single_day_data, Get_fenxi_day_data, Multi_data_analysis, \ 9 | multi_data_analysis_duori # 数据分析方法模块 10 | 11 | from core.day_danri_pyecharts import pyecharts_one_day, pyecharts_pinlei_oneday, pyecharts_one_day_pie, \ 12 | conversion_pie, unit_price_of_pieces, percentage_ctr_conversion_unit, one_pinlei_pie, tow_pinlei_pie, \ 13 | three_pinlei_pie, four_pinlei_pie # 单日可视化 14 | 15 | from core.many_day_pyecharts import days_pyecharts_bar, days_pyecharts_pie_ctr_business, \ 16 | days_pyecharts_pie_conversion_business, days_pyecharts_pie_upp_business, \ 17 | days_pyecharts_pie_cnu_business # 多日经营可视化数据主图附图 18 | 19 | from core.many_day_pyecharts import days_pyecharts_bar_category, dyas_pyecharts_pie_categouy_onehunderd, \ 20 | dyas_pyecharts_pie_categouy_towhunderd, dyas_pyecharts_pie_categouy_threehunderd, \ 21 | dyas_pyecharts_pie_categouy_fourhunderd 22 | 23 | '''登录界面视图函数''' 24 | 25 | 26 | @app.route("/", methods=['GET', 'POST']) 27 | @app.route("/login", methods=['GET', 'POST']) 28 | def login(): 29 | if request.method == 'POST': 30 | username = request.form['username'] 31 | password = request.form['password'] 32 | 33 | cur_users = Admin.query.filter(Admin.name == username).all() 34 | if cur_users: 35 | for cur_user in cur_users: 36 | if cur_user.validate_pwd(password): 37 | login_user(cur_user) 38 | flash('登入成功') 39 | return redirect(url_for('base')) 40 | 41 | flash('账户名或密码不对,请核对账号密码,若未注册请先注册') 42 | return redirect(url_for('login')) 43 | 44 | return render_template('login.html') 45 | 46 | 47 | '''注册界面视图函数''' 48 | 49 | 50 | @app.route("/register", methods=['GET', 'POST']) 51 | def register(): 52 | if request.method == 'POST': 53 | username = request.form['zusername'] 54 | password = request.form['zpassword'] 55 | 56 | if not username: 57 | flash('用户名不能为空') 58 | return redirect(url_for('register')) 59 | if not password: 60 | flash('密码不能为空') 61 | return redirect(url_for('register')) 62 | new_user = Admin(name=username, password=password, flasktime=Utility.get_cur_time()) 63 | new_user.set_pwd(password) 64 | db.session.add(new_user) 65 | db.session.commit() 66 | flash_sx = '注册成功,点击返回登录' 67 | return render_template('index.html', flash_sx=flash_sx) 68 | return render_template('register.html') 69 | 70 | 71 | '''主页视图函数''' 72 | 73 | 74 | @app.route('/base', methods=['POST', 'GET']) 75 | def base(): 76 | return render_template('base.html') 77 | 78 | 79 | '''数据管理视图函数''' 80 | 81 | 82 | @app.route('/query', methods=['POST', 'GET']) 83 | def query(): 84 | # 数据获取 85 | if request.method == 'POST': 86 | upload_file = request.files['query-input-uploaded_file'] 87 | action = request.form.get('action') 88 | 89 | if not upload_file: 90 | return "未选择上传文件" 91 | if not action: 92 | return "未指定操作" 93 | ''' 94 | if:显示数据判断逻辑 95 | elif:数据存储判断逻辑 96 | ''' 97 | if action == 'display': 98 | commerce_display = commerce(data=upload_file) 99 | commerce_biaoge_qiepian = commerce_display.loc[:, '货号':'到手价区间'] 100 | html_table_display = commerce_biaoge_qiepian.to_html(classes='table table-striped') 101 | return render_template('query.html', html_table_display=html_table_display) 102 | 103 | elif action == 'save': 104 | commerce_biaoge = commerce(data=upload_file) # pandas读取表格 105 | commerce_biaoge_qiepian = commerce_biaoge.loc[:, '货号':'到手价区间'] 106 | commerce_biaoge_qiepian.fillna(value=0, inplace=True) 107 | 108 | selected_columns = {'货号': 'produtc_code', 109 | '日期': 'sale_data', 110 | '客户数': 'customer_counts', 111 | '销售额': 'tltal_sales', 112 | '销售量(含拒退)': 'total_quantity', 113 | '销售额(扣满减含拒退)': 'sales_after_discount', 114 | 'UV': 'uv', 115 | '转化率': 'conversion_rate', 116 | '商品CTR': 'product_ctr', 117 | '曝光UV': 'exposure_uv', 118 | '款号辅助': 'style_code_auxiliary', 119 | '销售区间': 'sales_range', 120 | '品类': 'category', 121 | '活动': 'activity', 122 | '到手价': 'net_price', 123 | '到手价区间': 'net_price_range' 124 | } # 映射表格 125 | commerce_biaoge_qiepian.rename(columns=selected_columns, inplace=True) # 重命名表格对应数据库表格列 126 | try: 127 | num_rows_uploaded = 0 128 | for index, row in commerce_biaoge_qiepian.iterrows(): 129 | data_entry = Table(**row) 130 | db.session.add(data_entry) 131 | num_rows_uploaded += 1 # 每添加一行数据,增加计数器的值 132 | db.session.commit() 133 | return f'文件数据上传数据库成功,共上传了{num_rows_uploaded}行数据' 134 | except Exception as e: 135 | db.session.rollback() 136 | return f'错误:{str(e)}' 137 | 138 | return render_template('query.html') 139 | 140 | 141 | '''数据分析视图函数''' 142 | 143 | 144 | @app.route('/analysis', methods=['POST', 'GET']) 145 | def analysis(): 146 | html_table_display = None # 用于单日数据分析表格的HTML 147 | html_table_display_pinlei = None 148 | html_table_display_duori = None # 用于多日数据分析表格的HTML 149 | html_table_display_duori_pinlei = None 150 | if request.method == 'POST': 151 | analysis_route = request.form['analysis_type'] 152 | # 单日数据分析 153 | if analysis_route == 'single_day': 154 | analysis_route_single = request.form.get('single_date') 155 | df_single_day_data = get_single_day_data(analysis_route_single) # 数据清洗 156 | result_df, result_df_pinlei = Get_fenxi_day_data(dataframe=df_single_day_data) # 数据分析 157 | 158 | html_table_display = result_df.to_html(classes='table table-striped') 159 | html_table_display_pinlei = result_df_pinlei.to_html(classes='table table-striped') 160 | 161 | 162 | # 多日数据分析 163 | elif analysis_route == 'multi_day': 164 | analysis_route_multi_start = request.form.get('start_date') 165 | analysis_route_multi_end = request.form.get('end_date') 166 | data_shili = Multi_data_analysis(start_data=analysis_route_multi_start, 167 | ene_data=analysis_route_multi_end) 168 | muler_duori, muler_duori_pinlei = multi_data_analysis_duori(data_frame=data_shili) 169 | html_table_display_duori = muler_duori.to_html(classes='table table-striped2') 170 | html_table_display_duori_pinlei = muler_duori_pinlei.to_html(classes='table table-striped2') 171 | 172 | return render_template('analysis.html', 173 | html_table_display=html_table_display, 174 | html_table_display_pinlei=html_table_display_pinlei, 175 | html_table_display_duori=html_table_display_duori, 176 | html_table_display_duori_pinlei=html_table_display_duori_pinlei) 177 | 178 | 179 | '''数据可视化视图函数''' 180 | 181 | 182 | @app.route('/visualization', methods=['POST', 'GET']) 183 | def visualization(): 184 | # 单日可视化图表变量 185 | pyecharts_bar_chart_html = None 186 | pyecharts_bar_chart_pinlei_html = None 187 | pyecharts_bar_chart_pie_html = None 188 | pyecharts_pie_conversion = None 189 | pyecharts_pie_unti = None 190 | html_table_display_percentage = None 191 | '''销售品类附图''' 192 | pyecharts_one_pinlei_pie = None 193 | pyecharts_tow_pinlei_pie = None 194 | pyecharts_three_pinlei_pie = None 195 | pyecharts_four_pinlei_pie = None 196 | '''多日经营数据可视化全局变量''' 197 | pyecharts_days_bar_business = None 198 | pyecharts_days_pie_business_one = None 199 | pyecharts_days_pie_business_tow = None 200 | pyecharts_days_pie_business_three = None 201 | pyecharts_days_pie_business_four = None 202 | '''多日品类销售可视化数据变量''' 203 | pyecharts_days_bar_category = None 204 | pyecharts_days_pie_category_one = None 205 | pyecharts_days_pie_category_tow = None 206 | pyecharts_days_pie_category_three = None 207 | pyecharts_days_pie_category_four = None 208 | '''单日期变量''' 209 | analysis_route_single = None 210 | '''多日日期变量''' 211 | analysis_route_multi_start = None 212 | analysis_route_multi_end = None 213 | 214 | if request.method == 'POST': 215 | analysis_route = request.form['analysis_type'] 216 | # 单日可视化分析 217 | if analysis_route == 'single_day': 218 | analysis_route_single = request.form.get('single_date') 219 | df_single_duori_data = get_single_day_data(analysis_route_single) # 数据清洗 220 | result_df = Get_fenxi_day_data(dataframe=df_single_duori_data)[0] 221 | pinlei_df = Get_fenxi_day_data(dataframe=df_single_duori_data)[1] # 数据分析 222 | 223 | '''柱形图主图可视化''' 224 | pyecharts_bar_chart_html_oneday = pyecharts_one_day(data_frame=result_df) 225 | pyecharts_bar_chart_pinlei = pyecharts_pinlei_oneday(dataframe=pinlei_df) 226 | 227 | '''经营数据附图饼图''' 228 | pyecharts_bar_chart_pie = pyecharts_one_day_pie(data_frame=result_df) # 经营数据饼图--附图 229 | pyecharts_pie_conversions = conversion_pie(data_frame=result_df) 230 | pyecharts_pie_untis = unit_price_of_pieces(data_frame=result_df) 231 | html_table_display_percentages = percentage_ctr_conversion_unit(data_frame=result_df) 232 | 233 | '''经营数据dunp生成''' 234 | pyecharts_bar_chart_html = pyecharts_bar_chart_html_oneday.dump_options() # 经营数据主图 235 | pyecharts_bar_chart_pie_html = pyecharts_bar_chart_pie.dump_options() 236 | pyecharts_pie_conversion = pyecharts_pie_conversions.dump_options() 237 | pyecharts_pie_unti = pyecharts_pie_untis.dump_options() 238 | html_table_display_percentage = html_table_display_percentages.dump_options() 239 | 240 | '''销售品类附图饼图''' 241 | # pdb.set_trace()#调试模块 242 | pyecharts_one_pinlei_pies = one_pinlei_pie(data_frame=pinlei_df) 243 | pyecharts_tow_pinlei_pies = tow_pinlei_pie(data_frame=pinlei_df) 244 | pyecharts_three_pinlei_pies = three_pinlei_pie(data_frame=pinlei_df) 245 | pyecharts_four_pinlei_pies = four_pinlei_pie(data_frame=pinlei_df) 246 | 247 | '''销售品类dump生成''' 248 | pyecharts_bar_chart_pinlei_html = pyecharts_bar_chart_pinlei.dump_options() # 销售数据饼图 249 | pyecharts_one_pinlei_pie = pyecharts_one_pinlei_pies.dump_options() 250 | pyecharts_tow_pinlei_pie = pyecharts_tow_pinlei_pies.dump_options() 251 | pyecharts_three_pinlei_pie = pyecharts_three_pinlei_pies.dump_options() 252 | pyecharts_four_pinlei_pie = pyecharts_four_pinlei_pies.dump_options() 253 | 254 | '''多日可视化分析''' 255 | elif analysis_route == 'multi_day': 256 | 257 | '''数据获取''' 258 | analysis_route_multi_start = request.form.get('start_date') 259 | analysis_route_multi_end = request.form.get('end_date') 260 | 261 | '''多日数据分析''' 262 | data_pyecharts_analysis = Multi_data_analysis(start_data=analysis_route_multi_start, 263 | ene_data=analysis_route_multi_end) 264 | # pdb.set_trace() # 调试模块 265 | muler_duori = multi_data_analysis_duori(data_frame=data_pyecharts_analysis)[0] 266 | muler_duori_pinlei = multi_data_analysis_duori(data_frame=data_pyecharts_analysis)[1] 267 | 268 | '''多日经营数据可视化柱形图''' 269 | days_pyecharts_bar_categoryhtml = days_pyecharts_bar(data_frame=muler_duori) 270 | days_pyecharts_pie_business_one_html = days_pyecharts_pie_ctr_business(data_frame=muler_duori) 271 | days_pyecharts_pie_business_tow_html = days_pyecharts_pie_conversion_business(data_frame=muler_duori) 272 | days_pyecharts_pie_business_three_html = days_pyecharts_pie_upp_business(data_frame=muler_duori) 273 | days_pyecharts_pie_business_four_html = days_pyecharts_pie_cnu_business(data_frame=muler_duori) 274 | 275 | '''经营数据dunp生成''' 276 | pyecharts_days_bar_business = days_pyecharts_bar_categoryhtml.dump_options() 277 | pyecharts_days_pie_business_one = days_pyecharts_pie_business_one_html.dump_options() 278 | pyecharts_days_pie_business_tow = days_pyecharts_pie_business_tow_html.dump_options() 279 | pyecharts_days_pie_business_three = days_pyecharts_pie_business_three_html.dump_options() 280 | pyecharts_days_pie_business_four = days_pyecharts_pie_business_four_html.dump_options() 281 | 282 | '''多日销售品类可视化柱形图''' 283 | pyecharts_days_bar_category_html = days_pyecharts_bar_category(data_frame=muler_duori_pinlei) 284 | 285 | '''多日品类销售可视化附图饼形图''' 286 | pyecharts_days_pie_category_one_html = dyas_pyecharts_pie_categouy_onehunderd(data_frame=muler_duori_pinlei) 287 | pyecharts_days_pie_category_tow_html = dyas_pyecharts_pie_categouy_towhunderd(data_frame=muler_duori_pinlei) 288 | pyecharts_days_pie_category_three_html = dyas_pyecharts_pie_categouy_threehunderd( 289 | data_frame=muler_duori_pinlei) 290 | pyecharts_days_pie_category_four_html = dyas_pyecharts_pie_categouy_fourhunderd( 291 | data_frame=muler_duori_pinlei) 292 | 293 | '''销售品类数据dunp生成''' 294 | pyecharts_days_bar_category = pyecharts_days_bar_category_html.dump_options() 295 | pyecharts_days_pie_category_one = pyecharts_days_pie_category_one_html.dump_options() 296 | pyecharts_days_pie_category_tow = pyecharts_days_pie_category_tow_html.dump_options() 297 | pyecharts_days_pie_category_three = pyecharts_days_pie_category_three_html.dump_options() 298 | pyecharts_days_pie_category_four = pyecharts_days_pie_category_four_html.dump_options() 299 | return render_template('visualization.html', 300 | # 单日可视化 301 | pyecharts_bar_chart_html=pyecharts_bar_chart_html, 302 | pyecharts_bar_chart_pinlei_html=pyecharts_bar_chart_pinlei_html, 303 | pyecharts_bar_chart_pie_html=pyecharts_bar_chart_pie_html, 304 | pyecharts_pie_conversion=pyecharts_pie_conversion, 305 | pyecharts_pie_unti=pyecharts_pie_unti, 306 | html_table_display_percentage=html_table_display_percentage, 307 | pyecharts_one_pinlei_pie=pyecharts_one_pinlei_pie, 308 | pyecharts_tow_pinlei_pie=pyecharts_tow_pinlei_pie, 309 | pyecharts_three_pinlei_pie=pyecharts_three_pinlei_pie, 310 | pyecharts_four_pinlei_pie=pyecharts_four_pinlei_pie, 311 | # 单日日期传入 312 | analysis_route_single=analysis_route_single, 313 | # 多日可视化 314 | pyecharts_days_bar_business=pyecharts_days_bar_business, 315 | pyecharts_days_pie_business_one=pyecharts_days_pie_business_one, 316 | pyecharts_days_pie_business_tow=pyecharts_days_pie_business_tow, 317 | pyecharts_days_pie_business_three=pyecharts_days_pie_business_three, 318 | pyecharts_days_pie_business_four=pyecharts_days_pie_business_four, 319 | pyecharts_days_bar_category=pyecharts_days_bar_category, 320 | pyecharts_days_pie_category_one=pyecharts_days_pie_category_one, 321 | pyecharts_days_pie_category_tow=pyecharts_days_pie_category_tow, 322 | pyecharts_days_pie_category_three=pyecharts_days_pie_category_three, 323 | pyecharts_days_pie_category_four=pyecharts_days_pie_category_four, 324 | 325 | # 多日日期传递 326 | analysis_route_multi_start=analysis_route_multi_start, 327 | analysis_route_multi_end=analysis_route_multi_end 328 | ) 329 | 330 | 331 | '''退出登录视图函数''' 332 | 333 | 334 | @app.route('/logout', methods=['POST', 'GET']) 335 | def logout(): 336 | if request.method == 'POST': 337 | return render_template('login.html') 338 | 339 | 340 | '''本项目与2023年9月27好完成''' 341 | -------------------------------------------------------------------------------- /技术文档/flask电商数据分析技术文档.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaers1/Falsk_data_analysis/246d7f682e500cf2bf101b9a8dc6b57078021119/技术文档/flask电商数据分析技术文档.pdf --------------------------------------------------------------------------------