Python | NCL风格 | EOF | 相关 | 回归

这里在linux系统上使用geocat实现NCL风格的图片绘制

geocat
geocat

Linux上安装 geocat

conda update conda
conda create -n geocat -c conda-forge geocat-viz
conda activate geocat
conda update geocat-viz
  • Dataset
- NOAA Optimum Interpolation (OI) SST V2 # 海温月平均数据
- lsmask # 掩膜数据
- 1°x1° (180latx360lon)   # 空间分辨率
- 1981-12-01 ~ 2021-07-01  # 时间覆盖范围
- https://psl.noaa.gov/data/gridded/

导入基础库

import numpy as np
import pandas as pd
import xarray as xr
import os
from datetime import datetime
import cartopy.crs as ccrs
import cartopy.feature as cfeature
import matplotlib.pyplot as plt
import matplotlib.patheffects as PathEffects
from scipy import stats
import geocat.viz.util as gvutil
import cmaps
from geocat.comp import eofunc_eofs, eofunc_pcs
import sys
import inspect

设置数据时间、范围、EOF模态数量

# ----- Parameter setting ------
ystr = 1982
yend = 2020

latS = -30.
latN = 30.
lonW = 120.
lonE = 290

neof = 3

读取SST数据和MASK掩膜数据

# 打印当前目录
print("当前目录:", os.getcwd())
# == netcdf file name and location"
fnc = 'oisst_monthly.nc'
dmask = xr.open_dataset('lsmask.nc')
print(dmask)

ds = xr.open_dataset(fnc)
print(ds)

对于SST进行陆地掩膜 | 计算异常

# === Climatology and Anomalies
sst = ds.sst.where(dmask.mask.isel(time=0) == 1)
clm = sst.sel(time=slice(f'{ystr}-01-01',f'{yend}-12-01')).groupby('time.month').mean(dim='time')
anm = (sst.groupby('time.month') - clm)

plt.figure(dpi=200,figsize=(12,4))
plt.subplot(121)
sst[0].plot()
plt.title('With mask')
plt.subplot(122)
ds.sst[0].plot()
plt.title('Not mask')

Figure 2024-04-04 144410
Figure 2024-04-04 144410

计算季节平均 | 去趋势

# == seasonal mean
anmS = anm.rolling(time=3, center=True).mean('time')
anmDJF=anmS.sel(time=slice(f'{ystr}-01-01',f'{yend}-12-01',12))
print(anmDJF)


def wgt_areaave(indat, latS, latN, lonW, lonE):
  lat=indat.lat
  lon=indat.lon

  if ( ((lonW < 0or (lonE < 0 )) and (lon.values.min() > -1) ):
     anm=indat.assign_coords(lon=( (lon + 180) % 360 - 180) )
     lon=( (lon + 180) % 360 - 180)
  else:
     anm=indat

  iplat = lat.where( (lat >= latS ) & (lat <= latN), drop=True)
  iplon = lon.where( (lon >= lonW ) & (lon <= lonE), drop=True)

#  print(iplat)
#  print(iplon)
  wgt = np.cos(np.deg2rad(lat))
  odat=anm.sel(lat=iplat,lon=iplon).weighted(wgt).mean(("lon""lat"), skipna=True)
  return(odat)

# -- Detorending
def detrend_dim(da, dim, deg=1):
    # detrend along a single dimension
    p = da.polyfit(dim=dim, deg=deg)
    fit = xr.polyval(da[dim], p.polyfit_coefficients)
    return da - fit
    
anmDJF=detrend_dim(anmDJF,'time',1)  

这里的rolling(time=3, center=True).mean('time')可以理解为计算季节平均的过程,返回的是以1981-12-01为中心的(*、1981-12-01、1982-01-01)的平均值,1982-01-01为中心的(1981-12-01、1982-01-01、1982-02-01)的平均值,1982-02-01为中心的(1982-01-01、1982-02-01、1982-03-01)的平均值,...依次类推。

通过时间截取每12个月为一个周期的季节平均,即挑选出:1982-01-01 1983-01-01 ... 2020-01-01为中心的季节平均,作为每年的冬季平均值。

定义一个去趋势函数,函数名为detrend_dim,它的作用是沿着指定的维度对数据进行去趋势化处理。

函数的参数包括:

  • da:输入的数据数组,可以是 xarray.DataArray 类型。
  • dim:指定的维度,沿着这个维度进行去趋势化处理。
  • deg:多项式拟合的阶数,默认为1,即线性拟合。

函数的主要步骤包括:

  • 使用 da.polyfit() 方法进行多项式拟合,拟合得到沿着指定维度的多项式系数。
  • 使用 xr.polyval() 方法根据拟合的多项式系数计算拟合曲线。
  • 将原始数据减去拟合曲线得到去趋势化后的数据。
  • 最终函数返回去趋势化后的数据数组。

rolling()函数通过计算窗口中的数据点的平均值来代表窗口中心点的值。这与中心差分类似,因为我们在某一点附近使用了周围数据点的平均值来估计该点的值。因此,在某种程度上,你可以将滚动窗口均值视为一种离散形式的中心差分。

这里使用官网的一个例子来解释: https://docs.xarray.dev/en/stable/generated/xarray.DataArray.rolling.html

da = xr.DataArray(
    np.linspace(011, num=12),
    coords=[
        pd.date_range(
            "1999-12-15",
            periods=12,
            freq=pd.DateOffset(months=1),
        )
    ],
    dims="time",
)

da
<xarray.DataArray (time: 12)> Size: 96B
array([ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9.10.11.])
Coordinates:
  * time     (time) datetime64[ns] 961999-12-15 2000-01-15 ... 2000-11-15
  
da.rolling(time=3, center=True).mean()
<xarray.DataArray (time: 12)> Size: 96B
array([nan,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9.10., nan])
Coordinates:
  * time     (time) datetime64[ns] 961999-12-15 2000-01-15 ... 2000-11-15

在第一个数据点处,窗口中包含了该数据点、下一个数据点和前一个数据点。而在最后一个数据点处,窗口中包含了该数据点、前一个数据点和后一个数据点。由于这些位置处的窗口无法完全包含3个数据点,因此在这些位置处的滚动窗口均值计算结果为NaN。

所以第一个点rolling后的数值为nan,第二个点的数值为(0+1+2)/3=1,依次类推。


计算nino指数 | 与冬季海温异常的相关/回归系数

eof_sstDJF-nino_corr
eof_sstDJF-nino_corr
nino=wgt_areaave(anmDJF,-5,5,-170,-120)
ninoSD=nino/nino.std(dim='time')

# simultaneous
cor0 = xr.corr(ninoSD, anmDJF, dim="time")
reg0 = xr.cov(ninoSD,  anmDJF, dim="time")/ninoSD.var(dim='time',skipna=True).values

绘图 | Nino 指数 | 显著打点


def makefig0(cor, title, grid_space):

  cor = gvutil.xr_add_cyclic_longitudes(cor, 'lon')

  ax = fig.add_subplot(grid_space,
          projection=ccrs.Robinson(central_longitude=180))
  ax.coastlines(linewidth=0.5, alpha=0.6)
  
  gl = ax.gridlines(crs=ccrs.PlateCarree(),
                  draw_labels=True,
                  dms=False,
                  x_inline=False,
                  y_inline=False,
                  linewidth=1,
                  linestyle='dotted',
                  color="black",
                  alpha=0.3)
  gl.top_labels = False
  gl.right_labels = False
  gl.rotate_labels = False

  gvutil.add_major_minor_ticks(ax, labelsize=10)

  gvutil.add_lat_lon_ticklabels(ax)
  
  newcmp = cmaps.BlueYellowRed
  index = [520,  3550658595110125,  00135150,  165180200210220235250 ]
  color_list = [newcmp[i].colors for i in index]

  color_list[9]=[ 1.1.1.]
  color_list[10]=[ 1.1.1.]

  kwargs = dict(
    vmin = -1.0,
    vmax = 1.0,
    levels = 21,
    colors=color_list,
    add_colorbar=False,  # allow for colorbar specification later
    transform=ccrs.PlateCarree(),  # ds projection
  )

  fillplot = cor.plot.contourf(ax=ax,  **kwargs)
  ax.add_feature(cfeature.LAND, facecolor='lightgray', zorder=1)
  ax.add_feature(cfeature.COASTLINE, edgecolor='gray', linewidth=0.5, zorder=1)
 
  df = 35 
  sig=xr.DataArray(data=cor.values*np.sqrt((df-2)/(1-np.square(cor.values))),
      dims=["lat","lon'"],
      coords=[cor.lat, cor.lon])
  t90=stats.t.ppf(1-0.05, df-2)
  t95=stats.t.ppf(1-0.025, df-2)
  sig.plot.contourf(ax=ax,levels = [-1*t95, -1*t90, t90, t95], colors='none'
      hatches=['..'NoneNoneNone'..'], extend='both'
      add_colorbar=False, transform=ccrs.PlateCarree())
  gvutil.set_titles_and_labels(ax,
                             lefttitle=title,
                             lefttitlefontsize=16,
                             righttitle='',
                             righttitlefontsize=16,
                             xlabel="",
                             ylabel="")

  return ax, fillplot




def make_bar_plot0(dataset, grid_space):
    years = list(dataset.time.dt.year)
    values = list(dataset.values)
    colors = ['blue' if val < 0 else 'red' for val in values]

    ax = fig.add_subplot(grid_space)

    ax.bar(years,
           values,
           color=colors,
           width=1.0,
           edgecolor='black',
           linewidth=0.5)

    gvutil.add_major_minor_ticks(ax,
                                 x_minor_per_major=5,
                                 y_minor_per_major=5,
                                 labelsize=10)

    gvutil.set_axes_limits_and_ticks(ax,
                                     xticks=np.linspace(198020205),
                                     xlim=[1979.52020.5])
    gvutil.set_titles_and_labels(ax,
                             lefttitle='Nino3.4 index',
                             lefttitlefontsize=16,
                             righttitle='',
                             righttitlefontsize=16,
                             xlabel="Year",
                             ylabel="Standardized")
    return ax


# Show the plot

fig = plt.figure(figsize=(1012),dpi=200)
grid = fig.add_gridspec(ncols=1, nrows=3)
ax1, fill1 = makefig0(cor0,'SST correlation (>95%)', grid[0:2,0])

fig.colorbar(fill1,
                 ax=[ax1],
#                 ticks=np.linspace(-5, 5, 11),
                 drawedges=True,
                 orientation='horizontal',
                 shrink=0.5,
                 pad=0.05,
                 extendfrac='auto',
                 extendrect=True)

ax2 = make_bar_plot0(ninoSD, grid[2,0])

 
fig.suptitle('ENSO (DJF)', fontsize=18, y=0.9)

plt.draw()

plt.savefig(fnFIG+"nino_corr.png")

纬度加权处理

anmDJF = anmDJF.sortby("lat", ascending=True)
clat = anmDJF['lat'].astype(np.float64)
clat = np.sqrt(np.cos(np.deg2rad(clat)))
wanm = anmDJF 
wanm = anmDJF * clat
wanm.attrs = anmDJF.attrs
print(wanm)

截取太平洋中部区域

xw_anm = wanm.sel(lat=slice(latS, latN), lon=slice(lonW, lonE)).transpose('time''lat''lon')
print(xw_anm)

EOF 分析

eofs = eofunc_eofs(xw_anm.data, neofs=neof, meta=True)
pcs = eofunc_pcs(xw_anm.data, npcs=neof, meta=True)
# 对主成分进行标准化,即除以时间维度上的标准差,以确保主成分的方差为1。
pcs = pcs / pcs.std(dim='time')
pcs['time']=anmDJF['time']
pcs.attrs['varianceFraction'] = eofs.attrs['varianceFraction']
print(pcs)

evec = xr.DataArray(data=eofs, dims=('eof','lat','lon'),
    coords = {'eof': np.arange(0,neof), 'lat': xw_anm['lat'], 'lon': xw_anm['lon']} )
print(evec)

计算主成分与原始数据之间的相关系数(correlation)和回归系数(regression coefficient)

  • 计算主成分与原始数据 anmDJF 之间的相关系数,使用的函数是 xr.corr(),其中参数 dim="time" 指定了计算相关系数时沿着时间维度进行计算。

  • 使用 xr.cov() 函数计算协方差,然后除以第一个主成分的方差来得到回归系数。

如果解释变量(自变量)是一个主成分,而响应变量(因变量)是原始数据,且假设线性关系是准确的,那么回归系数可以通过计算主成分与原始数据的协方差除以主成分的方差来得到。最小二乘法的目标是最小化观测值与回归模型的残差平方和。对于简单线性回归模型,可以证明,使得残差平方和最小化的回归系数可以通过以下公式计算:

假设简单线性回归模型为:

其中, 是响应变量, 是解释变量, 是回归系数, 是随机误差。 我们知道,协方差的定义是:

其中, 分别是 的样本均值。现在,我们对 给定 求期望:

因为 是一个随机误差,所以在给定 的情况下, 的期望为零。因此,上式可以简化为

现在,我们来计算

因为

而且

所以上式可以进一步简化为:

因此,我们得到了公式 Var

cor1 = xr.corr(pcs[0,:], anmDJF, dim="time")
cor2 = xr.corr(pcs[1,:], anmDJF, dim="time")
cor3 = xr.corr(pcs[2,:], anmDJF, dim="time")
reg1 = xr.cov(pcs[0,:], anmDJF, dim="time")/pcs[0,:].var(dim='time',skipna=True).values
reg2 = xr.cov(pcs[1,:], anmDJF, dim="time")/pcs[1,:].var(dim='time',skipna=True).values
reg3 = xr.cov(pcs[2,:], anmDJF, dim="time")/pcs[2,:].var(dim='time',skipna=True).values

定义绘图函数 - 空间pattern

def makefig(dat, ieof, grid_space):
  # 通过添加子图 ax,使用 ccrs.PlateCarree 投影来绘制地图,并设置中心经度为 180 度。
  # 这样做是为了修正在 0 和 360 度经度附近未显示数据的问题。
  ax = fig.add_subplot(grid_space,
          projection=ccrs.PlateCarree(central_longitude=180))
  # 绘制海岸线
  ax.coastlines(linewidth=0.5, alpha=0.6)
  # 创建网格线,并进行相应的设置,包括绘制标签、设置线宽和样式、设置颜色和透明度等
  gl = ax.gridlines(crs=ccrs.PlateCarree(),
                  draw_labels=True,
                  dms=False,
                  x_inline=False,
                  y_inline=False,
                  linewidth=1,
                  linestyle='dotted',
                  color="black",
                  alpha=0.3)
  gl.top_labels = False
  gl.right_labels = False
  gl.rotate_labels = False
  gl.xlocator=ctk.LongitudeLocator(20)
  gl.ylocator=ctk.LatitudeLocator(5)
  # 添加主要和次要刻度线。
  gvutil.add_major_minor_ticks(ax, labelsize=10)
  
  # 添加纬度和经度的刻度标签。
  gvutil.add_lat_lon_ticklabels(ax)
  
  # 设置了填充图的颜色
  newcmp = cmaps.BlueYellowRed
  index = [520,  3550658595110125,  00135150,  165180200210220235250 ]
  color_list = [newcmp[i].colors for i in index]
  #-- Change to white
  color_list[9]=[ 1.1.1.]
  color_list[10]=[ 1.1.1.]
  
  # 绘制填充图所需的参数,如最小值、最大值、颜色等
  kwargs = dict(
    vmin = -0.06,
    vmax = 0.06,
    levels = 21,
    colors=color_list,
    add_colorbar=False,  # allow for colorbar specification later
    transform=ccrs.PlateCarree(),  # ds projection
  )
  
  # 填充图,并将其保存到变量 fillplot 中
  fillplot = dat[ieof,:,:].plot.contourf(ax=ax,  **kwargs)

  # 添加陆地和海岸线等地图特征。
  ax.add_feature(cfeature.LAND, facecolor='lightgray', zorder=1)
  ax.add_feature(cfeature.COASTLINE, edgecolor='gray', linewidth=0.5, zorder=1)
  
  # 图形的标题和标签。
  gvutil.set_titles_and_labels(ax,
                             lefttitle=f'EOF{ieof+1} pattern',
                             lefttitlefontsize=12,
                             righttitle='',
                             righttitlefontsize=12,
                             maintitle='',
                             xlabel="",
                             ylabel="")

  return ax, fillplot

定义柱状图的绘图函数

该函数接受三个参数:

  • dataset:包含数据的 xarray 数据集。
  • ieof:表示要绘制的主成分(PC)的索引。
  • grid_space:指定子图在网格中的位置。
def make_bar_plot(dataset, ieof, grid_space):

  # 获取数据集中时间坐标的年份、指定主成分的数据,并将其转换为列表 
    years = list(dataset.time.dt.year)
    values = list(dataset[ieof,:].values)
  # 根据主成分的值,生成与其相对应的颜色列表 colors,如果值小于 0,则对应颜色为蓝色,否则为红色。
    colors = ['blue' if val < 0 else 'red' for val in values]

    ax = fig.add_subplot(grid_space)

    ax.bar(years,
           values,
           color=colors,
           width=1.0,
           edgecolor='black',
           linewidth=0.5)

    # 添加主要和次要刻度线,并设置刻度线的密度和标签大小
    gvutil.add_major_minor_ticks(ax,
                                 x_minor_per_major=5,
                                 y_minor_per_major=5,
                                 labelsize=10)

    # 设置坐标轴的范围和刻度值。
    gvutil.set_axes_limits_and_ticks(ax,
                                     xticks=np.linspace(198020205),
                                     xlim=[1979.52020.5],
                                     ylim=[-3.03.5])

    pct = dataset.attrs['varianceFraction'].values[ieof] * 100
    print(pct)
    # 获取主成分的方差百分比,并将其转换为字符串格式
    # 设置图形的标题和标签,包括左侧标题、右侧标题、横坐标标签和纵坐标标签。
    gvutil.set_titles_and_labels(ax,
                             lefttitle=f'PC{ieof+1} (normalized)',
                             lefttitlefontsize=12,
                             righttitle=f'{pct:.1f}%',
                             righttitlefontsize=12,
                             xlabel="Year",
                             ylabel="",
                             labelfontsize=10 )
    return ax


绘图 | 保存图片


fig = plt.figure(figsize=(146),dpi=200)
grid = fig.add_gridspec(ncols=3, nrows=3, hspace=0.4)

ax1, fill1 = makefig(evec,0, grid[0:2,0])
ax2, fill2 = makefig(evec,1, grid[0:2,1])
ax3, fill3 = makefig(evec,2, grid[0:2,2])

fig.colorbar(fill2,
                 ax=[ax1,ax2,ax3],
                 ticks=np.linspace(-0.060.065),
                 drawedges=True,
                 label='Eigenvector',
                 orientation='horizontal',
                 shrink=0.3,
                 pad=0.08,
                 extendfrac='auto',
                 extendrect=True)

ax1 = make_bar_plot(pcs,0,grid[2,0])
ax2 = make_bar_plot(pcs,1,grid[2,1])
ax3 = make_bar_plot(pcs,2,grid[2,2])

 
fig.suptitle('EOF for SST (DJF)', fontsize=16, y=0.9)

plt.draw()
plt.savefig(fnFIG+".png")

展示绘图结果

eof_sstDJF
eof_sstDJF

未去线性趋势结果

  • 可以对比发现,未去掉线性趋势,对于模态的影响在第三模态,其空间patter以及PC的结果存在较大差异;而前两个模态影响较小。但是这个仅仅是对于该区域来说,对于其他区域的影响仍需要进一步探究。
eof_sstDJF-without-detrend
eof_sstDJF-without-detrend

未加权处理结果

  • 对于此区域来看,加权的结果对于分析影响较小。 eof_sstDJF-without-weight

绘制全球范围的EOF分析

eof_sstDJF-v3-glbaol
eof_sstDJF-v3-glbaol

未使用异常数据 | 全球

eof_sstDJF-without_ana
eof_sstDJF-without_ana

未使用异常数据 | 中太平洋

eof_sstDJF-without_ana_loc
eof_sstDJF-without_ana_loc
  • 对于是否使用异常SST来看,对于主导模态结果影响较小;但是个人感觉来说更取决于你所关注的研究方向。

绘制相关系数空间分布

eof_sstDJF-corr
eof_sstDJF-corr

def makefig2(dat, ieof, grid_space):

  ax = fig.add_subplot(grid_space,
          projection=ccrs.PlateCarree(central_longitude=180))
  ax.coastlines(linewidth=0.5, alpha=0.6)
  
  gl = ax.gridlines(crs=ccrs.PlateCarree(),
                  draw_labels=True,
                  dms=False,
                  x_inline=False,
                  y_inline=False,
                  linewidth=1,
                  linestyle='dotted',
                  color="black",
                  alpha=0.3)
  gl.top_labels = False
  gl.right_labels = False
  gl.rotate_labels = False
  gvutil.add_major_minor_ticks(ax, labelsize=10)
  gvutil.add_lat_lon_ticklabels(ax)
  newcmp = cmaps.BlueYellowRed
  index = [520,  3550658595110125,  00135150,  165180200210220235250 ]
  color_list = [newcmp[i].colors for i in index]
  #-- Change to white
  color_list[9]=[ 1.1.1.]
  color_list[10]=[ 1.1.1.]
  kwargs = dict(
    vmin = -1.0,
    vmax = 1.0,
    levels = 21,
    colors=color_list,
    add_colorbar=False,  # allow for colorbar specification later
    transform=ccrs.PlateCarree(),  # ds projection
  )

  fillplot = dat[:,:].plot.contourf(ax=ax,  **kwargs)

  ax.add_feature(cfeature.LAND, facecolor='lightgray', zorder=1)
  ax.add_feature(cfeature.COASTLINE, edgecolor='gray', linewidth=0.5, zorder=1)

  gvutil.set_titles_and_labels(ax,
                             lefttitle=f'EOF{ieof+1} pattern',
                             lefttitlefontsize=12,
                             righttitle='',
                             righttitlefontsize=12,
                             maintitle='',
                             xlabel="",
                             ylabel="")

  return ax, fillplot


# Show the plot
fig = plt.figure(figsize=(148),dpi=200)
grid = fig.add_gridspec(ncols=3, nrows=3, hspace=0.4)
ax1, fill1 = makefig2(cor1,0, grid[0:2,0])
ax2, fill2 = makefig2(cor2,1, grid[0:2,1])
ax3, fill3 = makefig2(cor3,2, grid[0:2,2])
fig.colorbar(fill2,
                 ax=[ax1,ax2,ax3],
                 ticks=np.linspace(-1.01.05),
                 drawedges=True,
                 label='Correlation',
                 orientation='horizontal',
                 shrink=0.3,
                 pad=0.08,
                 extendfrac='auto',
                 extendrect=True)
fig.suptitle('EOF for SST (DJF)', fontsize=16, y=0.85)
plt.draw()
plt.savefig(fnFIG+"corr.png",bbox_inches='tight')

https://geocat-viz.readthedocs.io/en/latest/installation.html

https://geocat-viz.readthedocs.io/en/latest/examples.html

http://unidata.github.io/netcdf4-python/

https://geocat-examples.readthedocs.io/en/latest/gallery/index.html

https://climate.usu.edu/people/yoshi/pyclm101/index.html

https://docs.xarray.dev/en/stable/gallery.html

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/792825.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++核心高级编程 --- 4.类和对象

文章目录 第四章&#xff1a;4.类和对象4.1 封装4.1.1 封装的意义4.1.2 struct与class的区别 4.2 对象的初始化和清理4.2.1 构造函数和析构函数4.2.2 构造函数的分类及调用4.2.3 拷贝构造函数调用时机4.2.4 构造函数调用规则4.2.5 深拷贝与浅拷贝4.2.6 初始化列表4.2.7 类对象作…

基础之重蹈覆辙

MESI缓存一致性协议 前&#x1f33d;&#xff1a; 高速缓存底层数据结构&#xff1a;拉链散列表的结构 bucket - cache entry - tag主内存地址 cache line缓存数据 flag缓存行状态 cache line64字节 有效引用主内存地址&#xff0c;连续的相邻的数据结构 读取特别快 处理器…

关于Tomcat双击startup.bat 闪退的解决⽅法

详解Tomcat双击startup.bat 闪退的解决⽅法 作为⼀个刚学习Tomcat的程序猿来说&#xff0c;这是会经常出现的错误。 1.环境变量问题 1.1 ⾸先需要确认java环境是否配置正确&#xff0c;jdk是否安装正确 winR打开cmd&#xff0c;输⼊java 或者 javac 出现下图所⽰就说明jdk配置正…

spark-hive连接操作流程、踩坑及解决方法

文章目录 1 简介2 版本匹配3 spark hive支持版本源码编译3.1 spark-src下载3.2 maven换源3.3 spark编译 4 hive 安装与mysql-metastore配置4.1 mysql下载安装4.1.1 为mysql设置系统环境变量4.1.2 初次登陆更改root身份密码4.1.3 安装后直接更改密码 4.2 hive初始化4.2.1 编写hi…

pycharm pyspark连接虚拟机的hive表 读取数据

方法&#xff1a; hive配置hiveserver2和metastore url <!-- 指定hiveserver2连接的host --> <property><name>hive.server2.thrift.bind.host</name><value>hadoop111</value> </property><!-- 指定hiveserver2连接的端口号 -…

langchain + azure chatgpt组合配置并运行

首先默认你已经有了azure的账号。 最重要的是选择gpt-35-turbo-instruct模型、api_version&#xff1a;2023-05-15&#xff0c;就这两个参数谷歌我尝试了很久才成功。 我们打开https://portal.azure.com/#home&#xff0c;点击更多服务&#xff1a; 我们点击Azure OpenAI&#…

华为ensp中ospf多区域管理 原理及配置命令(详解)

作者主页&#xff1a;点击&#xff01; ENSP专栏&#xff1a;点击&#xff01; ————前言———— OSPF 多区域的主要作用是缩小链路状态数据库和路由表的规模&#xff0c;减少路由更新的频率&#xff0c;提高网络的可扩展性&#xff0c;实现路由过滤和路由汇总&#xff0…

A First Course in the Finite Element Method【Daryl L.】|PDF电子书

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

zdpcss_transparent_animation_login:使用纯HTML+CSS+JS开发支持设置主题和带动画的科技风登录界面

废话不多说&#xff0c;先上图&#xff0c;有图有真相&#xff1a; 在左下角有一排颜色&#xff0c;点击可以设置主题色&#xff1a; 比如&#xff0c;我这里点击了橙色&#xff0c;登录界面就变成了如下样子&#xff1a; 另外&#xff0c;在输入账号和密码的时候&#x…

使用 ChatGPT 创建在线课程:一步一步指南与提示模板

原文&#xff1a;Creating Online Courses with ChatGPT 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 谢谢 作为对你支持的感谢&#xff0c;随意定制本书中列出的任何提示&#xff0c;并将其作为你自己的重新销售。是的&#xff0c;对你免费。 它们都结构良好且用…

蓝桥杯—DS1302

目录 1.管脚 2.时序&官方提供的读写函数 3.如何使用读写函数 4.如何在数码管中显示在DS1302中读取出的数据&#xff1f; 1.管脚 2.时序&官方提供的读写函数 /* # DS1302代码片段说明1. 本文件夹中提供的驱动代码供参赛选手完成程序设计参考。2. 参赛选手可以自行…

韩顺平Java | C23 反射Reflection

需求&#xff1a;通过外部文件配置&#xff0c;在不修改源码情况下控制程序&#xff08;符合设计模式ocp开闭原则&#xff1a;不修改源码的情况下扩容功能&#xff09; ※反射机制 反射机制允许程序在执行期间借助于ReflectioAPI取得任何类的内部信息&#xff08;如成员变量&…

跨境金融区块链服务平台

跨境金融服务是因企业及个人跨境经营、交易、投资、往来等活动而产生的资金使用、调拨、配置等需求&#xff0c;而提供的金融服务。近年来&#xff0c;随着我国经济的快速稳步增长和全球化经济一体化的不断深入发展&#xff0c;跨境金融业务增长迅速&#xff0c;监管也开始转化…

AcWing 731. 毕业旅行问题(每日一题)

原题链接&#xff1a;731. 毕业旅行问题 - AcWing题库 此题难度较大&#xff0c;是2019年字节跳动校招题&#xff0c;里面涉及位运算与状态压缩DP&#xff0c;不会的可以去学习&#xff0c;此题根据个人量力而行。 建议看一下y总的讲解&#xff1a;AcWing 731. 毕业旅行问题&…

初识MySQL(中篇)

使用语言 MySQL 使用工具 Navicat Premium 16 代码能力快速提升小方法&#xff0c;看完代码自己敲一遍&#xff0c;十分有用 目录 1.SQL语言 1.1 SQL语言组成部分 2.MySQL数据类型 2.1 数值类型 2.2 字符串类型 2.3 日期类型 3.创建数据表 3.1 创建数据表方法1 …

Mybitis根据Date查询,查询不到数据的一种情况

使用SimpleDateFormat创建Date对象时&#xff0c;调用SimpleDateFormat构造方法时格式要写为“yyyy-MM-dd”&#xff0c;如果写成“yyyy-mm-dd”会查询不到数据

2024-HW --->SSRF

这不是马上准备就要护网了嘛&#xff0c;如火如荼的报名ing&#xff01;&#xff01;&#xff01;那么小编就来查缺补漏一下以前的web漏洞&#xff0c;也顺便去收录一波poc&#xff01;&#xff01;&#xff01;&#xff01; 今天讲的主人公呢就是SSRF&#xff0c;以前学的时候…

windows server 配置DNS

配置DNS为本机IPV4地址 安装DNS服务器&#xff08;默认即可&#xff09;

【C++ STL排序容器】set 集合

文章目录 【 1. 基本原理 】【 2. set 的定义 】2.1 调用默认构造函数&#xff0c;创建空的 set 容器2.2 在创建 set 容器的同时&#xff0c;对其进行初始化2.3 拷贝构造的方式创建2.4 取已有 set 容器中的部分元素&#xff0c;来初始化新 set 容器2.5 修改排序规则的方式创建 …

Kotlin:for循环的几种示例

一、 打印 0 到 2 1.1 方式一&#xff1a;0 until 3 /*** 打印 0 到 2*/ fun print0To2M1(){for (inex in 0 until 3){// 不包含3print("$inex ")} }运行结果 1.2 方式二&#xff1a;inex in 0 …2 /*** 打印 0 到 2*/ fun print0To2M2(){for (inex in 0 ..2){//…