beihai commited on
Commit
d869f27
1 Parent(s): fdcf399

Upload 4 files

Browse files
Files changed (4) hide show
  1. Dockerfile +13 -0
  2. app.py +123 -0
  3. gitattributes +35 -0
  4. requirements.txt +9 -0
Dockerfile ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM python:3.9
2
+
3
+ RUN useradd -m -u 1000 user
4
+ USER user
5
+ ENV PATH="/home/user/.local/bin:$PATH"
6
+
7
+ WORKDIR /app
8
+
9
+ COPY --chown=user ./requirements.txt requirements.txt
10
+ RUN pip install --no-cache-dir --upgrade -r requirements.txt
11
+
12
+ COPY --chown=user . /app
13
+ CMD ["gunicorn", "app:app", "--bind", "0.0.0.0:7860"]
app.py ADDED
@@ -0,0 +1,123 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from flask import Flask, request, jsonify
2
+ from flask_cors import CORS
3
+ import pandas as pd
4
+ from openai import OpenAI
5
+ import re
6
+ import plotly.io as pio
7
+ import json
8
+ import plotly.express as px
9
+ import os
10
+ from dotenv import load_dotenv
11
+
12
+ # Load environment variables from .env file
13
+ load_dotenv()
14
+
15
+ # Get the API key from the environment variable
16
+ api_key = os.getenv('OPENAI_API_KEY')
17
+ pio.renderers.default = 'json'
18
+
19
+ app = Flask(__name__)
20
+ CORS(app, resources={r"/analyze": {"origins": "https://viz.zhanglearning.com"}})
21
+
22
+ @app.route('/analyze', methods=['POST'])
23
+ def analyze():
24
+ if 'file' not in request.files:
25
+ return jsonify({'error': '没有文件上传'}), 400
26
+
27
+ file = request.files['file']
28
+ prompt = request.form.get('prompt', '')
29
+
30
+ if file.filename == '':
31
+ return jsonify({'error': '没有选择文件'}), 400
32
+
33
+ if file and file.filename.endswith('.csv'):
34
+ df = pd.read_csv(file)
35
+ data_info = df.dtypes.to_dict()
36
+ #data_columns = df.columns.tolist()
37
+
38
+ #client = OpenAI(api_key=api_key, base_url="https://api.siliconflow.cn/v1")
39
+ client = OpenAI(api_key=api_key,base_url='https://api.deepseek.com/v1')
40
+ messages = [
41
+ {"role": "system", "content": """
42
+ 你是数据分析、可视化和 Jupyter Notebook 开发方面的专家,专注于 Python 库,如 pandas、matplotlib、seaborn 和 numpy。
43
+ **关键原则:**
44
+ - 用准确的 Python 示例写出简洁的技术回复。
45
+ - 在数据分析工作流中优先考虑可读性和可重复性。
46
+ - 在适当的时候使用函数式编程;避免不必要的类。
47
+ - 优先使用向量化操作而不是显式循环以获得更好的性能。
48
+ - 使用描述性的变量名以反映它们所包含的数据。
49
+ - 遵循 Python 代码的 PEP 8 风格指南。
50
+
51
+ **数据分析和操作:**
52
+ - 使用 pandas 进行数据操作和分析。
53
+ - 在可能的情况下,优先使用方法链进行数据转换。
54
+ - 使用 loc 和 iloc 进行明确的数据选择。
55
+ - 利用 groupby 操作进行高效的数据聚合。
56
+
57
+ **可视化:**
58
+ - 使用 matplotlib 进行低级绘图控制和自定义。
59
+ - 使用 seaborn 进行统计可视化和美观的默认设置。
60
+ - 创建带有适当标签、标题和图例的信息丰富且视觉上吸引人的图。
61
+ - 使用适当的配色方案并考虑色盲可访问性。
62
+
63
+ **Jupyter Notebook 最佳实践:**
64
+ - 使用 Markdown 单元格以清晰的部分结构笔记本。
65
+ - 使用有意义的单元格执行顺序以确保可重复性。
66
+ - 在 Markdown 单元格中包含解释性文本以记录分析步骤。
67
+ - 保持代码单元格专注且模块化,以便于理解和调试。
68
+ - 使用诸如 %matplotlib inline 之类的魔术命令进行内联绘图。
69
+
70
+ **错误处理和数据验证:**
71
+ - 在分析开始时实施数据质量检查。
72
+ - 适当地处理缺失数据(插补、删除或标记)。
73
+ - 对于容易出错的操作使用 try-except 块,尤其是在读取外部数据时。
74
+ - 验证数据类型和范围以确保数据完整性。
75
+
76
+ **依赖项:**
77
+ - pandas
78
+ - numpy
79
+ - matplotlib
80
+ - seaborn
81
+ - jupyter
82
+ - scikit-learn(用于机器学习任务)
83
+
84
+ **关键约定:**
85
+ 1. 以数据探索和汇总统计开始分析。
86
+ 2. 创建可重用的绘图函数以实现一致的可视化。
87
+ 参考 pandas、matplotlib 和 Jupyter 的官方文档以获取最佳实践和最新的 API。
88
+ """},
89
+ {"role": "user", "content": f"""
90
+ 根据接收的数据字段和类型:{data_info},{prompt},注意:我已经安装好了所有依赖;
91
+ 请确保在代码中使用 'df' 变量来引用数据框;直接给我最终代码即可,不要写注释;请确保在代码中使用 'df' 变量来引用数据框。
92
+ 使用 plotly.express 进行可视化,并使用 'px' 作为别名。
93
+ 不要使用 df_filtered 变量,所有的过滤操作都应该直接在 df 上进行。
94
+ """}
95
+ ]
96
+
97
+ response = client.chat.completions.create(
98
+ model="deepseek-ai/DeepSeek-Coder-V2-Instruct",
99
+ messages=messages,
100
+ stream=False
101
+ )
102
+
103
+ response_code = response.choices[0].message.content
104
+ code_blocks = re.findall(r'```(.*?)```', response_code, re.DOTALL)
105
+ cleaned_code_blocks = [code.replace("python\n", "") for code in code_blocks]
106
+
107
+ results = []
108
+ for code in cleaned_code_blocks:
109
+ try:
110
+ local_vars = {'df': df,'px': px}
111
+ exec(code, globals(), local_vars)
112
+ for var_name, var_value in local_vars.items():
113
+ if var_name.startswith('fig'):
114
+ results.append(pio.to_json(var_value))
115
+ except Exception as e:
116
+ print(f"执行代码时出错:{str(e)}")
117
+
118
+ return jsonify({'plots': results})
119
+
120
+ return jsonify({'error': '不支持的文件类型'}), 400
121
+
122
+ if __name__ == '__main__':
123
+ app.run(debug=True)
gitattributes ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
5
+ *.ckpt filter=lfs diff=lfs merge=lfs -text
6
+ *.ftz filter=lfs diff=lfs merge=lfs -text
7
+ *.gz filter=lfs diff=lfs merge=lfs -text
8
+ *.h5 filter=lfs diff=lfs merge=lfs -text
9
+ *.joblib filter=lfs diff=lfs merge=lfs -text
10
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
+ *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
+ *.model filter=lfs diff=lfs merge=lfs -text
13
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
14
+ *.npy filter=lfs diff=lfs merge=lfs -text
15
+ *.npz filter=lfs diff=lfs merge=lfs -text
16
+ *.onnx filter=lfs diff=lfs merge=lfs -text
17
+ *.ot filter=lfs diff=lfs merge=lfs -text
18
+ *.parquet filter=lfs diff=lfs merge=lfs -text
19
+ *.pb filter=lfs diff=lfs merge=lfs -text
20
+ *.pickle filter=lfs diff=lfs merge=lfs -text
21
+ *.pkl filter=lfs diff=lfs merge=lfs -text
22
+ *.pt filter=lfs diff=lfs merge=lfs -text
23
+ *.pth filter=lfs diff=lfs merge=lfs -text
24
+ *.rar filter=lfs diff=lfs merge=lfs -text
25
+ *.safetensors filter=lfs diff=lfs merge=lfs -text
26
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
28
+ *.tar filter=lfs diff=lfs merge=lfs -text
29
+ *.tflite filter=lfs diff=lfs merge=lfs -text
30
+ *.tgz filter=lfs diff=lfs merge=lfs -text
31
+ *.wasm filter=lfs diff=lfs merge=lfs -text
32
+ *.xz filter=lfs diff=lfs merge=lfs -text
33
+ *.zip filter=lfs diff=lfs merge=lfs -text
34
+ *.zst filter=lfs diff=lfs merge=lfs -text
35
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
requirements.txt ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ Flask==3.0.3
2
+ Flask_Cors==4.0.1
3
+ pandas==2.2.3
4
+ plotly==5.18.0
5
+ Requests==2.32.3
6
+ openai==1.33.0
7
+ plotly==5.18.0
8
+ python-dotenv==1.0.1
9
+ gunicorn