Pandas简介
Pandas 是一个强大的数据处理和分析库,广泛应用于 Python 数据科学和机器学习领域。它提供了丰富的数据结构和数据操作工具,使得数据清洗、转换、合并、重塑、选择等任务变得更加简单高效。以下是 Pandas 的一些主要特点和常用功能:
主要特点
-
数据结构:
- Series:一维带标签的数组,可以存储任何数据类型(整数、字符串、浮点数、Python 对象等)。
- DataFrame:二维带标签的数据结构,可以看作是由多个 Series 组成的表格,支持不同的数据类型。
-
数据导入导出:
- 支持多种文件格式的数据读写,包括 CSV、Excel、SQL 数据库、JSON、HTML 等。
-
数据清洗:
- 提供了丰富的数据清洗工具,如缺失值处理、重复值处理、数据类型转换等。
-
数据选择和过滤:
- 强大的数据选择和过滤功能,支持按条件筛选、按索引选择、布尔索引等。
-
数据操作:
- 支持数据排序、去重、合并、分组聚合等操作。
-
时间序列分析:
- 提供了专门的时间序列数据处理功能,如日期范围生成、频率转换、移动窗口统计等。
常用功能
-
创建 DataFrame:
import pandas as pddata = {'Name': ['Alice', 'Bob', 'Charlie'],'Age': [25, 30, 35],'City': ['New York', 'Los Angeles', 'Chicago'] }df = pd.DataFrame(data)
-
读取和保存数据:
# 读取 CSV 文件 df = pd.read_csv('data.csv')# 保存 DataFrame 到 CSV 文件 df.to_csv('output.csv', index=False)
-
数据选择和过滤:
# 按条件筛选 young_people = df[df['Age'] < 30]# 按索引选择 first_row = df.loc[0]# 按列名选择 names = df['Name']
-
数据清洗:
# 处理缺失值 df.dropna() # 删除含有缺失值的行 df.fillna(0) # 用 0 填充缺失值# 重命名列 df.rename(columns={'OldName': 'NewName'})
-
数据操作:
# 分组聚合 age_group = df.groupby('City')['Age'].mean()# 合并 DataFrame df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]}) df2 = pd.DataFrame({'A': [5, 6], 'B': [7, 8]}) merged_df = pd.concat([df1, df2])# 排序 sorted_df = df.sort_values(by='Age', ascending=False)
-
时间序列分析:
# 创建日期范围 date_range = pd.date_range(start='1/1/2020', periods=10)# 设置 DataFrame 的索引为日期 df.set_index(date_range, inplace=True)# 滚动窗口计算 rolling_mean = df['Value'].rolling(window=3).mean()
总结
Pandas 是一个非常强大的库,适用于各种数据处理和分析任务。无论你是初学者还是有经验的数据科学家,Pandas 都是一个值得掌握的工具。希望以上介绍对你有所帮助!如果你有任何具体的问题或需要进一步的示例,请随时提问。
Pandas 查询引擎
本指南向您展示如何使用我们的PandasQueryEngine
:使用llm
将自然语言转换为Pandas python
代码。
PandasQueryEngine
的输入是一个Pandas数据框,输出是一个响应。LLM
推断要执行的数据帧操作,以便检索结果。
警告:此工具提供对eval函数的LLM访问。可以在运行此工具的机器上执行任意代码。虽然对代码进行了某种程度的过滤,但不建议在没有大量沙箱或虚拟机的生产环境中使用该工具。
如果你在colab
上打开这个Notebook,你可能需要安装LlamaIndex
🦙。
pip install llama-index llama-index-experimental
pip install llama-index-core
pip install llama-index-llms-dashscope
import logging
import sys
from IPython.display import Markdown, displayimport pandas as pd
from llama_index.experimental.query_engine import PandasQueryEnginelogging.basicConfig(stream=sys.stdout, level=logging.INFO)
logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))
让我们从DataFrame开始
这里,让我们加载一个非常简单的包含城市和人口对的数据框架,并在其上运行PandasQueryEngine
。
通过设置verbose=True
,我们可以看到中间生成的指令。
Settings.llm = DashScope(model_name=DashScopeGenerationModels.QWEN_TURBO, api_key="your-api-key", max_tokens=512,system_prompt="总是用中文回答"
)# 对一些样本数据进行测试
df = pd.DataFrame({"city": ["Toronto", "Tokyo", "Berlin"],"population": [2930000, 13960000, 3645000],}
)query_engine = PandasQueryEngine(df=df, verbose=True)response = query_engine.query("人口最多的城市是哪个?",
)
print("--------------------------------------")
print(str(response))
print("########################################")
# 获取pandas python 指令
print(response.metadata["pandas_instruction_str"])
Pandas Instructions:
df.loc[df['population'].idxmax(), 'city']
Pandas Output: TokyoTokyo
########################################
df.loc[df[‘population’].idxmax(), ‘city’]
df.loc[df['population'].idxmax(), 'city']
这行代码的作用是从DataFrame df
中找出人口 (population
) 最多的城市 (city
) 的名称。让我们分解一下这行代码来更好地理解它的功能:
-
df['population'].idxmax()
:- 这部分代码用于找到
population
列中的最大值对应的索引。idxmax()
函数会返回该列中最大值所在的那一行的索引标签。
- 这部分代码用于找到
-
df.loc[...]
:loc
是Pandas库中用于按标签访问数据的方法。它允许你通过指定行标签或列标签来选择数据。
-
df.loc[df['population'].idxmax(), 'city']
:- 首先,
df['population'].idxmax()
找到了population
列中最大值所在的行的索引。 - 然后,
df.loc[...]
使用这个索引来选择对应的整行数据。 - 最后,
'city'
参数告诉loc
方法只返回这一行中city
列的值。
- 首先,
综上所述,这段代码的结果就是返回 DataFrame df
中 population
列的最大值对应的城市名。如果 df
是一个包含不同城市及其人口数据的表格,那么这段代码将告诉你哪个城市的人口最多,并给出这个城市的名称。
我们还可以采取使用 LLM
合成响应的步骤。
query_engine = PandasQueryEngine(df=df, verbose=True, synthesize_response=True)
response = query_engine.query("人口最多的城市是哪个?同时给出城市和人口",
)
print(str(response))
print(response.metadata["pandas_instruction_str"])
Pandas Instructions:
df.loc[df['population'].idxmax(), ['city', 'population']]
Pandas Output: city Tokyo
population 13960000
Name: 1, dtype: object
city Tokyo
population 13960000
Name: 1, dtype: object
df.loc[df[‘population’].idxmax(), [‘city’, ‘population’]]
df.loc[df['population'].idxmax(), ['city', 'population']]
这行代码的作用是从DataFrame df
中找出人口 (population
) 最多的城市 (city) 的名称及其人口数。['city', 'population']
参数告诉 loc
方法只返回这一行中 city
和 population
列的值。
分析泰坦尼克号数据集
泰坦尼克号数据集是入门级机器学习中最受欢迎的表格数据集之一
来源: https://www.kaggle.com/c/titanic
下载数据
https://raw.githubusercontent.com/jerryjliu/llama_index/main/docs/docs/examples/data/csv/titanic_train.csv
保存为 titanic_train.csv 文件,放到代码根目录文件夹下
df = pd.read_csv("./titanic_train.csv")
query_engine = PandasQueryEngine(df=df, verbose=True)
response = query_engine.query("What is the correlation between survival and age?",
)
Pandas Instructions:
df['survived'].corr(df['age'])
Pandas Output: -0.07722109457217755
df[‘survived’].corr(df[‘age’])
-0.07722109457217755
df['survived'].corr(df['age'])
这行代码是用来计算DataFramedf
中的两个列'survived'
和'age'
之间的皮尔逊相关系数(Pearson correlation coefficient)。这里假设df
是一个使用Pandas库创建的数据表。
皮尔逊相关系数衡量的是两个变量之间的线性关系强度和方向。其值范围从 -1 到 +1:-
如果相关系数接近 +1,这意味着两个变量之间存在强正相关关系,即一个变量增加时另一个变量也倾向于增加。
-
如果相关系数接近 -1,这意味着两个变量之间存在强负相关关系,即一个变量增加时另一个变量倾向于减少。
-
如果相关系数接近 0,则表明两个变量之间没有明显的线性关系。
在你的例子中,
'survived'
可能是一个二进制变量(例如,生存状态,1 表示生还,0 表示未生还),而'age'
是乘客的年龄。计算这两个变量的相关系数可以帮助了解年龄是否与生还率有线性关系,以及这种关系的方向是正向还是负向。
-
其他步骤
分析/修改提示
让我们看看提示!
from llama_index.core import PromptTemplate
query_engine = PandasQueryEngine(df=df, verbose=True)
prompts = query_engine.get_prompts()
print(prompts["pandas_prompt"].template)
You are working with a pandas dataframe in Python. The name of the
dataframe isdf
. This is the result ofprint(df.head())
: {df_str}Follow these instructions: {instruction_str} Query: {query_str}
Expression: print(prompts[“response_synthesis_prompt”].template) Given
an input question, synthesize a response from the query results.
Query: {query_str}Pandas Instructions (optional): {pandas_instructions}
Pandas Output: {pandas_output}
Response:
您也可以更新提示:
new_prompt = PromptTemplate("""\
You are working with a pandas dataframe in Python.
The name of the dataframe is `df`.
This is the result of `print(df.head())`:
{df_str}Follow these instructions:
{instruction_str}
Query: {query_str}Expression: """
)query_engine.update_prompts({"pandas_prompt": new_prompt})
这是指令字符串(您可以通过在初始化时传入来自定义)instruction_str
instruction_str = """\
1. Convert the query to executable Python code using Pandas.
2. The final line of code should be a Python expression that can be called with the `eval()` function.
3. The code should represent a solution to the query.
4. PRINT ONLY THE EXPRESSION.
5. Do not quote the expression.
"""