Przeglądaj źródła

12月27日更新

张世豪 1 miesiąc temu
rodzic
commit
ca7d923892
3 zmienionych plików z 56 dodań i 22 usunięć
  1. 5 5
      index.py
  2. 8 8
      public.py
  3. 43 9
      report.py

+ 5 - 5
index.py

@@ -308,8 +308,8 @@ def checkData(fileUrl):
                     if i not in strList:
                         simpleData[i] = pd.to_numeric(simpleData[i], errors='coerce')
                 # 处理重复样品
-                res = getRepeat(simpleData)
-                simpleData = simpleData._append(res).drop_duplicates(subset=['原样品编号'], keep='last')
+                # res = getRepeat(simpleData)
+                # simpleData = simpleData._append(res).drop_duplicates(subset=['原样品编号'], keep='last')
                 print(0.1)
                 # 按照剖面层级排序
                 newOrderRes = report.orderData(simpleData)
@@ -512,7 +512,7 @@ def checkData(fileUrl):
                     '水溶性碳酸氢离子含量cmol(1/2HCO3-)/kg': hcoArr,
                     '水溶性硫酸根离子含量cmol(1/2SO42-)/kg': soArr,
                     '八大离子加和g/kg': eightPlusArr,
-                    '(水溶性全盐量-八大离子加和)/水溶性全盐量×100': (allArr - eightPlusArr) / allArr * 100,
+                    '(水溶性全盐量-八大离子加和)/水溶性全盐量×100': 2*(allArr - eightPlusArr) / (allArr + eightPlusArr) * 100,
                     '离子总量g/kg': filter_number(simpleData['离子总量']),
                     '阳离子总量-阴离子总量': totalCations - totalAnions,
                     '土地利用类型': simpleData['土地利用类型']
@@ -1723,8 +1723,8 @@ def dealData(data):
         if i not in strList:
             simpleData[i] = pd.to_numeric(simpleData[i], errors='coerce')
     # 处理重复样品
-    res = getRepeat(simpleData)
-    simpleData = simpleData._append(res).drop_duplicates(subset=['原样品编号'], keep='last')
+    # res = getRepeat(simpleData)
+    # simpleData = simpleData._append(res).drop_duplicates(subset=['原样品编号'], keep='last')
     simpleData = report.orderData(simpleData)['allData']
     return simpleData
 

+ 8 - 8
public.py

@@ -568,8 +568,8 @@ def eight_ion_coun(arr, summary):
                 rateArr.append('存疑:(水溶性全盐量-八大离子加和)/水溶性全盐量×100复核数据合理性。')
             else:
                 rateArr.append('')
-            #(17)阳离子总量 - 阴离子总量应基本相等,超过±1则提示异常
-            if not pd.isna(row['阳离子总量-阴离子总量']) and (row['阳离子总量-阴离子总量'] < -1 or row['阳离子总量-阴离子总量'] > 1) :
+            #(17)阳离子总量 - 阴离子总量应基本相等,超过±0.5则提示异常
+            if not pd.isna(row['阳离子总量-阴离子总量']) and (row['阳离子总量-阴离子总量'] < -0.5 or row['阳离子总量-阴离子总量'] > 0.5) :
                 subtractionArr.append('存疑:阳离子总量 - 阴离子总量复核数据合理性。')
             else:
                 subtractionArr.append('')
@@ -613,7 +613,7 @@ def nutrient_data(arr):
         sKErrTar = []  # 保存交换性钾不等于速效钾
         for index, row in arr.iterrows():
             # 交换性钾 == 速效钾
-            if not pd.isna(row['速效钾mg/kg']) and not pd.isna(row['交换性钾']) and ((row['速效钾mg/kg'] - row['交换性钾']*391)/ (row['交换性钾']*391) > 0.2 or (row['速效钾mg/kg'] - row['交换性钾']*391)/ (row['交换性钾']*391) < -0.2):
+            if not pd.isna(row['速效钾mg/kg']) and not pd.isna(row['交换性钾']) and (2*(row['速效钾mg/kg'] - row['交换性钾']*391) / (row['速效钾mg/kg'] + row['交换性钾']*391) > 0.2 or 2*(row['速效钾mg/kg'] - row['交换性钾']*391)/ (row['速效钾mg/kg'] + row['交换性钾']*391) < -0.2):
                 sKErr.append('存疑:交换性钾和速效钾误差超20%。')
                 sKErrTar.append('交换性钾、速效钾。')
             else:
@@ -648,7 +648,7 @@ def nutrient_data(arr):
                 KArr.append('')
                 KArrTar.append('')
             #(6)有效磷在[1, 80]范围之外的;存疑; 耕地 超过80存疑
-            if (row['pH'] >= 6.5 and (row['有效磷g/kg'] < 3 or row['有效磷g/kg'] > 60)) or (row['pH'] < 6.5 and (row['有效磷g/kg'] <1 or row['有效磷g/kg'] > 80) or (row['编号'][6:10] == '0101' or row['编号'][6:10] == '0102' or row['编号'][6:10] == '0103') and row['有效磷g/kg'] > 60) :
+            if (row['pH'] >= 6.5 and (row['有效磷g/kg'] < 3 or row['有效磷g/kg'] > 60)) or (row['pH'] < 6.5 and (row['有效磷g/kg'] < 1 or row['有效磷g/kg'] > 50) or ( row['编号'][6:10] == '0101' or row['编号'][6:10] == '0102' or row['编号'][6:10] == '0103') and row['有效磷g/kg'] > 60):
                 availableP.append('有效磷:复核数据合理性。')
                 availablePTar.append('有效磷。')
             else:
@@ -680,10 +680,10 @@ def nutrient_data(arr):
             #(10)有机质、全氮含量异常高,但速效养分特低,提示异常   无法量化不处理
             #(11)母岩为片麻岩,但全钾、速效缓效钾含量低,提示异常   无法量化不处理
             #(12)有效磷<3和大于60,提示异常;速效钾<50提示异常
-            if row['有效磷g/kg'] < 3 or row['有效磷g/kg'] > 60:
-                availablePCom.append('有效磷:复核数据合理性。')
-            else:
-                availablePCom.append('')
+            # if row['有效磷g/kg'] < 3 or row['有效磷g/kg'] > 60:
+            #     availablePCom.append('有效磷:复核数据合理性。')
+            # else:
+            #     availablePCom.append('')
             if row['速效钾mg/kg'] < 50:
                 availableTxt.append('速效钾:复核数据合理性。')
             else:

+ 43 - 9
report.py

@@ -792,7 +792,7 @@ def getNAndC(data, url):
     # 设置图表布局
     fig.update_layout(
                       title={
-                          'text': f"有机质与全氮相关关系图,y={round(slope,2)}x + {round(intercept,2)},R²={round(r[1],2)}",
+                          'text': f"有机质与全氮相关关系图,y={round(slope,2)}x + {round(intercept,2)},R²={round(r[1], 2) ** 2},R={round(r[1],2)}",
                           'xanchor': 'center',  # 控制水平对齐,可选'left', 'center', 'right'
                           'yanchor': 'bottom',  # 控制垂直对齐,可选'top', 'middle', 'bottom'
                           'x': 0.5,  # 控制标题的水平位置,0.5代表中心,可以是小数(相对位置)或整数(像素位置)
@@ -902,10 +902,45 @@ def getMetal(simpleData):
 # 16.阳离子交换量与交换性盐基总量
 def cationExchangeCapacity(data, url):
     # 绘图
-    x = data['阳离子交换量']
-    y = data['交换性盐基总量']
-    getInteractiveImg(x, y, '阳离子交换量与交换性盐基总量相关关系', [], [], '', [], [], '', url,
-                      '阳离子交换量与交换性盐基总量相关关系', '样品序号', 'mg/kg', data['原样品编号'])
+    x1 = data['阳离子交换量']
+    y1 = data['交换性盐基总量']
+    fig = go.Figure(data=go.Scatter(
+        x=x1,
+        y=y1,
+        text=data['原样品编号'].to_numpy(),
+        mode='markers', name='阳离子交换量与交换性盐基总量相关性散点图',
+        marker=dict(
+            size=4,  # 点的大小
+            color='blue',  # 点的颜色
+        ))
+    )
+    print(3.43)
+    # 使用sklearn的LinearRegression进行最小二乘法拟合
+    model = LinearRegression()
+    model.fit(x1.to_numpy().reshape(-1, 1), y1)
+    # 计算拟合直线的斜率和截距
+    slope = model.coef_[0]
+    intercept = model.intercept_
+    r, _ = np.corrcoef(y1, slope * x1 + intercept)
+    # 绘制拟合直线
+    fig.add_trace(go.Scatter(x=x1, y=slope * x1 + intercept, mode='lines', name='拟合直线'))
+    # plt.plot(x, slope * x + intercept, color='red', label='拟合直线',  linewidth=2)
+    # 设置图表布局
+    fig.update_layout(
+        title={
+            'text': f"阳离子交换量与交换性盐基总量相关性散点图,y={round(slope, 2)}x + {round(intercept, 2)},R²={round(r[1], 2) ** 2},R={round(r[1], 1)}",
+            'xanchor': 'center',  # 控制水平对齐,可选'left', 'center', 'right'
+            'yanchor': 'bottom',  # 控制垂直对齐,可选'top', 'middle', 'bottom'
+            'x': 0.5,  # 控制标题的水平位置,0.5代表中心,可以是小数(相对位置)或整数(像素位置)
+            'y': 0.9  # 控制标题的垂直位置,0.9代表底部,可以是小数或整数
+        },
+        xaxis_title='阳离子交换量(g/kg)',
+        yaxis_title='交换性盐基总量(mS/cm)')
+    html_file_path = f"{url}/阳离子交换量与交换性盐基总量相关性散点图.html"
+    pio.write_html(fig, file=html_file_path, auto_open=False)
+    # 同时保存一份图片
+    pio.write_image(fig, f"{url}/阳离子交换量与交换性盐基总量相关性散点图.png")
+
 
 # cationExchangeCapacity('')
 # 17.交换性盐基:二者之差 交换性盐基总量cmol(+)/kg 交换性钙镁钠钾之和 区分ph>7.5 和ph值<7.5
@@ -976,7 +1011,7 @@ def manyTypes(data,url):
     # 设置图表布局
     fig.update_layout(
                       title={
-                          'text':f"全盐量与电导率相关关系图,y={round(slope, 2)}x + {round(intercept, 2)},R²={round(r[1], 2)}",
+                          'text':f"全盐量与电导率相关关系图,y={round(slope, 2)}x + {round(intercept, 2)},R²={round(r[1], 2) ** 2},R={round(r[1], 2)}",
                           'xanchor': 'center',  # 控制水平对齐,可选'left', 'center', 'right'
                           'yanchor': 'bottom',  # 控制垂直对齐,可选'top', 'middle', 'bottom'
                           'x': 0.5,  # 控制标题的水平位置,0.5代表中心,可以是小数(相对位置)或整数(像素位置)
@@ -994,10 +1029,9 @@ def manyTypes(data,url):
     y2 = filterData['离子总量'].sort_values()
     y3 = filterData['全盐量'].sort_values()
     y4 = (y2-y3).sort_values()
-
     getInteractiveImg(x2, y2, '离子总量', x2, y3, '水溶性盐总量', x2, y4,
-                      '离子总量与水溶性盐总量之差', url,
-                      '离子总量与水溶性盐总量关系图', '样品序号', '离子总量/水溶性盐总量(g/kg)', data['原样品编号'])
+                    '离子总量与水溶性盐总量之差', url,
+                    '离子总量与水溶性盐总量关系图', '样品序号', '离子总量/水溶性盐总量(g/kg)', data['原样品编号'])
 
 # 绘制水稳数据折线图
 def makeWaterImg(data,url,name):