前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ChatGPT 高级数据分析用于自定义 Matplotlib 测井图

ChatGPT 高级数据分析用于自定义 Matplotlib 测井图

作者头像
磐创AI
发布2024-07-01 14:37:57
910
发布2024-07-01 14:37:57
举报

ChatGPT 的代码解释器,现在更名为高级数据分析,已经发布一段时间了。它于2023年7月6日推出,是由OpenAI开发的插件,允许用户上传数据并对其进行分析。这可以包括清理数据、创建可视化图表和总结数据。

与其依赖于您编写Python代码来分析数据,不如通过使用普通英语告诉ChatGPT要做什么。然后,它将为您执行分析。

正如我的常读者们所知,我是Matplotlib的忠实粉丝。尽管该库看起来使用起来很繁琐且耗时,但稍加努力就可以用它创建令人惊叹的可视化效果。

在尝试了这个新工具后,我认为是时候看看ChatGPT和高级数据分析插件如何用于创建处理测井数据的自定义图表了。

在继续之前,由于对OpenAI提起的法律诉讼不断增加:

始终谨慎上传到ChatGPT的数据,因为这些数据和您的输入可能被用来训练未来的模型。如果有疑虑,请避免上传任何数据,并始终遵循您公司的政策。

启用ChatGPT中的高级数据分析

要在ChatGPT中使用高级数据分析插件,首先必须启用它。

可以通过转到设置,然后选择Beta功能来完成。在这里,您将看到启用高级数据分析的选项,该选项将启用插件。

插件现在将在启动新聊天时可用。

上传和转换数据为Pandas数据框

首先,我们需要上传我们的文件。在这个示例中,我使用的是来自NLOG数据库的测井数据集(文章末尾有详细信息)。该数据集包含从油气勘探井中获得的一系列测井测量。

首先,我们首先点击聊天输入框上的加号图标,然后选择包含我们数据的文件。

接下来,我们需要为ChatGPT提供一个提示。在这种情况下,我打算告诉它成为一个岩相学家(地球科学中的一个小众角色),并且它了解测井测量。这有助于微调ChatGPT返回的一些响应。

提交上述输入后,ChatGPT将加载文件并查看其内容。

下面是ChatGPT的高级数据分析插件返回的响应,它提供了关于我们数据集中每个测量的信息。

在这种情况下,它使用pandas将CSV文件读入数据框,然后使用常见的df.head()命令输出头部。

该文件中关于曲线的大多数评论都是正确的。但是,也存在一些不一致之处,比如DT代表Delta-Time。这在部分上是正确的;但是,这个曲线代表的是声波工具发出的声波经过地层传播的压缩到达的声波,衡量了这种压缩到达的声波。

根据我的ChatGPT经验,我发现在岩相学等小众主题中使用它可能会有些挑战,并可能返回不正确的信息。这是在使用大型语言模型(LLMs)时每个人都应该注意到的事情。

始终仔细检查输出并确保其有意义。

我之前在下面的文章中涵盖了这个主题:

https://towardsdatascience.com/openais-amazing-chatgpt-is-it-promising-for-niche-topics-fcee2328dbd8

点击“显示工作”下拉框,我们可以查看用于加载数据的代码。我们可以看到它已经执行了一些基本的Python代码,将我们的CSV文件读入pandas数据框。

代码语言:javascript
复制
import pandas as pd

# Load the data from the provided CSV file
well_data = pd.read_csv("/mnt/data/L0509WellData.csv")

# Display the first few rows of the data
well_data.head()

ChatGPT还识别到一些曲线中的占位值为-999。这些值代表缺失的数据。然而,正如我们将看到的那样,这可能导致我们获得的响应中出现一些混淆和问题。

使用代码解释器进行数据探索

在使用任何数据集时,最耗时的部分是了解您拥有的数据,进行数据质量检查并清理数据。

这正是我个人认为ChatGPT的高级数据分析插件对岩相学家和数据科学家最有帮助的地方。然而,正如始终一样,必须检查这些AI系统产生的结果和工作,因为它们可能无意中犯了一些错误。

在尝试数据清理步骤时,ChatGPT在将-999值转换为NaN时遇到了困难。在这样做时,它还将列数据类型转换为字符串。

因此,我必须在我的请求中明确说明确保保持列为数值类型。

最终,它回复如下:

以及以下代码

代码语言:javascript
复制
# Replace -999 values with NaN
well_data.replace(-999, float("nan"), inplace=True)

# Display the first few rows of the updated data
well_data.head()

这生成了以下输出:

代码语言:javascript
复制
RESULT
       DEPTH         GR         DT      RHOB      DRHO      NPHI
0  4609.8008  89.059479       <NA>  2.483700  0.018494  0.129119
1  4609.9008  90.721848       <NA>  2.489308  0.013656  0.108034
2  4610.0008  90.709061       <NA>  2.501088  0.011289  0.085650
3  4610.1008  89.568954  66.223099  2.515450  0.008615  0.070332
4  4610.2008  88.169571  66.705551  2.530982  0.005628  0.065343

这很有趣,也有点奇怪,因为响应试图将字符串"nan"转换为浮点数。我本来会在数据框的replace函数中使用np.nan,以便用NaN替代-999值。然而,目前似乎已经起作用了,但这将在后续步骤中引起问题。

生成描述性摘要

接下来,让我们看看是否可以使用以下简单的提示获取数据集中每个测量的描述性摘要表。

ChatGPT返回了以下表格作为响应。

乍一看,它可能看起来与df.describe()函数的输出相同;然而,ChatGPT还为每个测量添加了单位。如果我们想将此内容放入报告中,这是很方便的。尽管将单位放在左侧行标题而不是每个框中可能会更好。

此外,它将孔隙度的单位从小数转换为百分比。当报告或将信息传递给同事时,这可能会导致混淆。我更希望它保留原始单位的数据。

最后,由于存在空值,它未能为DT曲线创建统计信息 — 这与ChatGPT未能将-999值转换为空值的早期部分相关。然而,如果我们使用df.describe()方法并且数据是数值型的,那么我们仍然应该看到该曲线的统计信息。

对于一个不了解的数据分析师,这可能潜在地会被忽略。

使用Matplotlib和ChatGPT高级数据分析插件创建测井图

当我开始在Medium上写文章时,我专注于如何使用Matplotlib创建基本的测井图,并如何使用Python处理测井数据。由于我对Python相对陌生且难以编写正确的代码,这个过程花费了很多时间。

基本上,测井图包含多个子图,通常被称为迹道。在每个迹道中,绘制了不同的科学测量值,这些值可以一起用于对地下结构进行解释。每个测量都是相对于y轴的深度进行绘制的。

作为对ChatGPT高级数据分析插件的快速测试,我想看看它是否可以帮助使用几个简单的提示重新创建我先前文章中的测井图。

第一步是让它创建一个基本的测井图,其中每个测量都显示在自己的子图中。

在处理并编写第一次尝试的代码后,ChatGPT再次遇到了与数据集中的NaN值相关的问题。因此,它必须重新创建绘图。

绘图生成后,它返回了相对不错的第一次尝试绘图的结果。

有趣的是,它还对绘图进行了一些调整,包括:

  1. 反转y轴,使得从浅深度到深深度
  2. 对一些测量应用了标准刻度,例如GR的刻度为0到150

ChatGPT生成的代码如下:

代码语言:javascript
复制
# Setting up the figure and axes again
fig, ax = plt.subplots(nrows=1, ncols=6, figsize=(15, 10), sharey=True)

# Plotting DEPTH on the first track
ax[0].plot(well_data['DEPTH'], well_data['DEPTH'], color='black')
ax[0].set_title('DEPTH')
ax[0].set_ylabel('Depth (m)')
ax[0].invert_yaxis()  # Invert the y-axis to have depth increasing downwards
ax[0].grid()

# Plotting GR on the second track
ax[1].plot(well_data['GR'], well_data['DEPTH'], color='green')
ax[1].set_title('GR (Gamma Ray)')
ax[1].set_xlim(0, 150)  # Typical scale for GR
ax[1].grid()

# Plotting DT on the third track (excluding NaN values)
ax[2].plot(well_data['DT'].dropna(), well_data['DEPTH'].loc[well_data['DT'].dropna().index], color='blue')
ax[2].set_title('DT (Delta Time)')
ax[2].grid()

# Plotting RHOB on the fourth track
ax[3].plot(well_data['RHOB'], well_data['DEPTH'], color='red')
ax[3].set_title('RHOB (Bulk Density)')
ax[3].set_xlim(1.5, 3.0)  # Typical scale for RHOB
ax[3].grid()

# Plotting DRHO on the fifth track
ax[4].plot(well_data['DRHO'], well_data['DEPTH'], color='cyan')
ax[4].set_title('DRHO')
ax[4].grid()

# Plotting NPHI on the sixth track
ax[5].plot(well_data['NPHI'], well_data['DEPTH'], color='magenta')
ax[5].set_title('NPHI (Neutron Porosity)')
ax[5].set_xlim(-0.15, 0.45)  # Typical scale for NPHI
ax[5].grid()

plt.tight_layout()
plt.show()

这段代码与我先前文章中的代码非常相似,但它不是使用subplot2grid,而是访问各个轴并添加绘图。

现在,我们可以采取这个绘图并通过一次性进行多个更改。

在使用ChatGPT时,我通常发现将提示拆分为单独的指令可以帮助获得所需的输出。然而,为了了解ChatGPT的代码解释器如何同时响应多个命令,我们可以使用以下提示来进行以下更改:

  1. 删除包含深度曲线的子图
  2. 为每个子图添加网格线
  3. 在每个子图的右侧和顶部添加脊柱
  4. 为每个曲线添加标准颜色
  5. 确保所有曲线都有定义的x轴刻度范围

经过进一步处理,ChatGPT返回了包含我请求的更改的绘图。

它还重构了代码,不再使用对每个轴的单独调用,而是使用循环遍历每个测量,并使用一些常见函数(如脊柱和网格颜色)应用更改。

代码语言:javascript
复制
# Setting up the figure and axes with one less subplot for depth
fig, ax = plt.subplots(nrows=1, ncols=5, figsize=(15, 10), sharey=True)

# Define a dictionary for colors and scales for each log
colors = {
    "GR": "green",
    "DT": "magenta",
    "RHOB": "red",
    "DRHO": "grey",
    "NPHI": "blue"
}
scales = {
    "GR": (0, 150),
    "DT": (140, 40),
    "RHOB": (1.95, 2.95),
    "DRHO": (-0.2, 0.2),
    "NPHI": (0.45, -0.15)
}

# Plotting each log with the specified colors and scales
logs = ['GR', 'DT', 'RHOB', 'DRHO', 'NPHI']
for i, log in enumerate(logs):
    ax[i].plot(well_data[log], well_data['DEPTH'], color=colors[log])
    ax[i].set_xlim(scales[log])
    ax[i].set_title(log)
    ax[i].grid(color="lightgrey")
    # Adding top and right spines
    ax[i].spines['top'].set_visible(True)
    ax[i].spines['right'].set_visible(True)

ax[0].set_ylabel('Depth (m)')
ax[0].invert_yaxis()  # Invert the y-axis to have depth increasing downwards

plt.tight_layout()
plt.show()

在Y轴和线之间添加可变填充

在测井图上,通常会在曲线和子图边缘之间应用阴影和额外填充。这有助于岩相学家通过可视化曲线理解数据。

其中一种方法是对伽马射线(GR)应用可变阴影,以帮助识别泥页岩和非泥页岩间隔。为此,我们通常使用Yellow — Orange — Brown颜色映射,可以帮助显示清洁的储层间隔为较亮的颜色,而泥页岩间隔为较暗的颜色。

我在先前的文章中深入介绍了这个过程。

https://towardsdatascience.com/enhancing-visualization-of-well-logs-with-plot-fills-72d9dcd10c1b

我之前尝试过在ChatGPT和代码解释器中实现这一点,但总是不成功。也许这是由于我如何设置提示。

让我们看看ChatGPT是否可以通过在提示中更具体,帮助创建GR曲线的YlOrBr颜色映射阴影。

我们得到了以下绘图:

在第一次尝试中,它设法在子图上获取了填充。然而,它没有从子图的左侧到曲线进行填充。

我们可以看看ChatGPT是否会纠正这一点:

它确实做到了,这非常令人惊讶,因为先前的尝试都失败了。

我们可以仔细查看代码,了解生成绘图所做的操作。

代码语言:javascript
复制
# Setting up the figure and axes again
fig, ax = plt.subplots(nrows=1, ncols=5, figsize=(15, 10), sharey=True)

# Plotting each log with the specified colors and scales, excluding NaN values for DT
for i, log in enumerate(logs):
    valid_indices = well_data[log].dropna().index
    ax[i].plot(well_data[log].loc[valid_indices], well_data['DEPTH'].loc[valid_indices], color=colors[log])
    ax[i].set_xlim(scales[log])
    ax[i].set_title(log)
    ax[i].grid(color="lightgrey")
    # Adding top and right spines
    ax[i].spines['top'].set_visible(True)
    ax[i].spines['right'].set_visible(True)

    # Adding the fill for the GR subplot
    if log == 'GR':
        # Add color based on the value of the GR line
        for depth, value in zip(well_data['DEPTH'].loc[valid_indices], well_data[log].loc[valid_indices]):
            ax[i].fill_betweenx([depth-0.05, depth+0.05], 
                                0, value, 
                                facecolor=plt.cm.YlOrBr(value/150), 
                                edgecolor='none', 
                                zorder=0)  # Place the fill behind the line

ax[0].set_ylabel('Depth (m)')
ax[0].invert_yaxis()  # Invert the y-axis to have depth increasing downwards

plt.tight_layout()
plt.show()

ChatGPT采用的方法与我先前的尝试不同,我先前的尝试是循环遍历每个排序值并在曲线下面应用填充。而ChatGPT是逐深度进行,然后应用填充。

代码语言:javascript
复制
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np 

left_col_value = 0
right_col_value = 150

#assign the column to a variable for easier reading
curve = well_data['GR']

#calculate the span of values
span = abs(left_col_value - right_col_value)

#assign a color map
cmap = plt.get_cmap('YlOrBr')

#create array of values to divide up the area under curve
color_index = np.arange(left_col_value, right_col_value, span / 100)

#setup the plot
well_data.plot(x='GR', y='DEPTH', c='black', lw=0.5, legend=False, figsize=(6,15))
plt.ylim(4800, 4600)
plt.xlim(left_col_value, right_col_value)
plt.title('Plot With a Variable Fill to Y-Axis')

#loop through each value in the color_index
for index in sorted(color_index):
    index_value = (index - left_col_value)/span
    color = cmap(index_value) #obtain colour for color index value
    plt.fill_betweenx(well_data['DEPTH'], 0 , curve, where = curve >= index,  color = color)

plt.show()

上面的代码生成了带有阴影的以下GR图。

将两条线移动到同一子图上

在测井图上,常见的是在同一迹道上绘制体积密度(RHOB)和中子孔隙度(NPHI)。由于这两个曲线具有不同的刻度,我们需要将其中一条放在次要x轴上。

在Matplotlib中正确实现这一点可能有些棘手,因此我们将看看ChatGPT如何应对以下提示。

返回的绘图并不糟糕。ChatGPT已经成功将NPHI曲线放在与RHOB相同的子图上,并将其放在次要x轴上。然而,子图的标签彼此重叠,不清楚刻度属于哪条曲线。

此外,现在子图上有两组网格线,可能会引起混淆。

我们可以通过一个简单的提示进行修改,以确保标签不重叠,并从其中一条曲线上移除网格线。

ChatGPT按照要求完成了任务,但它还为不同的标签添加了颜色。

我没有预料到结果会这样,但这确实使我们能够轻松地将标签与正确的曲线关联起来。

因此,基于ChatGPT更改标签颜色,我们可以将其作为灵感来改变其余标签以匹配曲线的颜色。

如果在同一子图上有多条曲线,这应该对我们有所帮助,这在测井图中非常常见。

ChatGPT现在已经回应了我们的最终绘图,现在我们可以轻松地看到NPHI和RHOB的刻度以及它们所属的曲线。

以下是ChatGPT为生成上述绘图提出的代码。

代码语言:javascript
复制
# Setting up the figure and axes again
fig, ax = plt.subplots(nrows=1, ncols=4, figsize=(15, 10), sharey=True)

# Plotting each log with the specified colors and scales, excluding NaN values
for i, log in enumerate(logs):
    valid_indices = well_data[log].dropna().index
    ax[i].plot(well_data[log].loc[valid_indices], well_data['DEPTH'].loc[valid_indices], color=colors[log])
    ax[i].set_xlim(scales[log])
    # Remove subplot title
    ax[i].set_title("")
    # Add axis label representing the name of the log measurement
    ax[i].set_xlabel(log, color=colors[log])
    # Color tick marks and tick labels in the same color as the line
    ax[i].tick_params(axis='x', colors=colors[log])
    # Adding top and right spines
    ax[i].spines['top'].set_visible(True)
    ax[i].spines['right'].set_visible(True)

    # Adding the fill for the GR subplot
    if log == 'GR':
        # Add color based on the value of the GR line
        for depth, value in zip(well_data['DEPTH'].loc[valid_indices], well_data[log].loc[valid_indices]):
            ax[i].fill_betweenx([depth-0.05, depth+0.05], 
                                0, value, 
                                facecolor=plt.cm.YlOrBr(value/150), 
                                edgecolor='none', 
                                zorder=0)  # Place the fill behind the line
        ax[i].grid(color="lightgrey")

    # Adding NPHI to the RHOB subplot with a secondary x-axis
    if log == 'RHOB':
        ax2 = ax[i].twiny()  # Create a secondary x-axis for NPHI
        valid_indices_nphi = well_data['NPHI'].dropna().index
        ax2.plot(well_data['NPHI'].loc[valid_indices_nphi], well_data['DEPTH'].loc[valid_indices_nphi], color=colors['NPHI'])
        ax2.set_xlim(scales['NPHI'])
        ax2.set_xlabel('NPHI', color=colors['NPHI'])
        ax2.tick_params(axis='x', colors=colors['NPHI'])
        # Remove gridlines for NPHI and display the ones for RHOB
        ax2.grid(False)
        ax[i].grid(color="lightgrey")

ax[0].set_ylabel('Depth (m)')
ax[0].invert_yaxis()  # Invert the y-axis to have depth increasing downwards

plt.tight_layout()
plt.show()

绘图和代码看起来合理,我可能会进行一些修改。然而,在这一点上,我觉得最好继续使用Jupyter Notebooks修改绘图。

这是由于我之前遇到的一些问题,如果我回去更改了早期的提示,它会清除该提示之后的所有内容并重新创建它。

总结

总体而言,我发现ChatGPT的数据分析插件(以前是代码解释器)在生成岩相学和地球科学的测井图方面是一个有用的工具。然而,我对使用它有一些保留和问题。

我发现在新的聊天实例中很难复制结果。我先前尝试过上面相同的过程,结果完全不同,ChatGPT难以生成我想要的绘图。即使使用完全相同的提示,这种情况也会发生。

有时,数据分析插件生成的结果令人质疑,甚至是错误的。与任何大型语言模型一样,审查输出并确保在编程和技术上有意义总是明智的。

如果在提示中犯了任何错误,要回去更改它们并不容易。如果您尝试更改提示中的某个内容,可能会导致删除该提示之后的任何聊天内容。因此,我建议在进行时将代码复制到Jupyter Notebook中,以便您不会失去任何信息。

最后,对使用ChatGPT和数据分析插件的最大保留是上传专有数据(在此示例中,我使用的是公共数据,可供使用)。数据、提示和输出都可以用来训练未来的模型,而您可能并不知情。围绕版权和知识产权的问题日益严重,因此在使用该工具和专有数据时应谨慎。

✄-----------------------------------------------

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 磐创AI 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 启用ChatGPT中的高级数据分析
  • 上传和转换数据为Pandas数据框
  • 使用代码解释器进行数据探索
    • 生成描述性摘要
    • 使用Matplotlib和ChatGPT高级数据分析插件创建测井图
    • 在Y轴和线之间添加可变填充
    • 将两条线移动到同一子图上
    • 总结
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档