Local 适配器使用指南
概述
本文档提供 Local 适配器的详细使用指南,包括基本用法和常见使用场景。
快速开始
安装
Local 适配器是 FQData 的一部分,无需单独安装。确保已安装 pandas:
bash
pip install pandas基本使用
python
from FQData.DataSource.adapters.local import LocalAdapter
adapter = LocalAdapter(base_path="/path/to/data")
df = adapter.read_csv("stock_data.csv")
print(f"读取 {len(df)} 行数据")基本操作
创建适配器
python
from FQData.DataSource.adapters.local import LocalAdapter
# 无基础路径
adapter = LocalAdapter()
# 有基础路径
adapter = LocalAdapter(base_path="/data")
adapter = LocalAdapter(base_path="./data")读取 CSV 文件
python
# 基础读取
df = adapter.read_csv("data.csv")
# 指定编码
df = adapter.read_csv("data.csv", encoding="gbk")
# 使用 pandas 参数
df = adapter.read_csv("data.csv", sep="\t", nrows=1000)写入 CSV 文件
python
# 基本写入
success = adapter.write_csv(df, "output.csv")
# 指定编码
success = adapter.write_csv(df, "output.csv", encoding="gbk")
# 不写入索引
success = adapter.write_csv(df, "output.csv", index=False)检查文件
python
# 检查文件是否存在
if adapter.file_exists("data.csv"):
print("文件存在")
else:
print("文件不存在")列出文件
python
# 列出所有 CSV 文件
files = adapter.list_files("*.csv")
# 列出匹配的文件
files = adapter.list_files("stock_*.csv")
# 递归列出
files = adapter.list_files("**/*.csv")CSVReader 高级用法
创建读取器
python
from FQData.DataSource.adapters.local import CSVReader
reader = CSVReader(
base_path="/data",
default_encoding="utf-8",
default_date_format="%Y-%m-%d"
)基本读取
python
df = reader.read("stock_600000.csv")日期解析
python
# 自动检测日期列
df = reader.read_with_date_parse("daily.csv")
# 指定日期列
df = reader.read_with_date_parse("daily.csv", date_columns=["date"])
# 指定日期格式
df = reader.read_with_date_parse("daily.csv", date_format="%Y/%m/%d")日期范围读取
python
# 读取指定范围
df = reader.read_date_range(
"daily.csv",
start="2024-01-01",
end="2024-12-31"
)
# 只有开始日期
df = reader.read_date_range(
"daily.csv",
start="2024-01-01"
)
# 只有结束日期
df = reader.read_date_range(
"daily.csv",
end="2024-12-31"
)指定列读取
python
df = reader.read_columns(
"daily.csv",
columns=["date", "open", "high", "low", "close", "volume"]
)条件过滤
python
# 精确匹配
df = reader.read_with_filter(
"daily.csv",
filters={"code": "600000"}
)
# 范围匹配
df = reader.read_with_filter(
"daily.csv",
filters={"volume": (10000, 50000)}
)
# 多条件
df = reader.read_with_filter(
"daily.csv",
filters={
"code": "600000",
"volume": (10000, 50000)
}
)获取文件信息
python
info = reader.get_info("daily.csv")
print(f"路径: {info['path']}")
print(f"大小: {info['size_bytes'] / 1024:.2f} KB")
print(f"修改时间: {info['modified_time']}")
print(f"列: {info['columns']}")
print(f"行数: {info['row_count_estimate']}")实际使用场景
场景 1:读取本地缓存的股票数据
python
from FQData.DataSource.adapters.local import CSVReader
reader = CSVReader(base_path="/data/stocks")
df = reader.read_date_range(
"600000_daily.csv",
start="2024-01-01",
end="2024-12-31"
)
print(df.head())场景 2:批量读取多个文件
python
from FQData.DataSource.adapters.local import LocalAdapter
adapter = LocalAdapter(base_path="/data")
codes = ["600000", "600036", "601318"]
data_dict = {}
for code in codes:
df = adapter.read_csv(f"{code}_daily.csv")
if df is not None:
data_dict[code] = df场景 3:数据导出
python
from FQData.DataSource.adapters.local import LocalAdapter
adapter = LocalAdapter(base_path="/data/output")
# 写入数据
success = adapter.write_csv(result_df, "analysis_result.csv")
if success:
print("数据已保存")
else:
print("保存失败")场景 4:数据备份
python
from FQData.DataSource.adapters.local import LocalAdapter
from datetime import datetime
adapter = LocalAdapter(base_path="/data")
# 按日期备份
today = datetime.now().strftime("%Y%m%d")
backup_file = f"backup_{today}.csv"
success = adapter.write_csv(source_df, backup_file)场景 5:增量更新数据
python
from FQData.DataSource.adapters.local import CSVReader
reader = CSVReader(base_path="/data")
existing_file = "daily.csv"
new_data_file = "new_daily.csv"
existing = reader.read_date_range(existing_file, end="2024-06-30")
new_data = reader.read_date_range(new_data_file, start="2024-07-01")
if new_data is not None and not new_data.empty:
combined = pd.concat([existing, new_data]).drop_duplicates()
combined = combined.sort_values("date")
reader.write_csv(combined, existing_file)错误处理
检查返回值
python
from FQData.DataSource.adapters.local import LocalAdapter
adapter = LocalAdapter(base_path="/data")
df = adapter.read_csv("data.csv")
if df is None:
print("读取失败,请检查文件是否存在")
else:
print(f"读取成功,{len(df)} 行")文件不存在处理
python
file_path = "data.csv"
if adapter.file_exists(file_path):
df = adapter.read_csv(file_path)
else:
print(f"文件 {file_path} 不存在")
df = None写入失败处理
python
success = adapter.write_csv(df, "output.csv")
if not success:
print("写入失败,请检查路径和权限")路径使用技巧
绝对路径
python
adapter = LocalAdapter()
df = adapter.read_csv("/data/stock_600000.csv")相对路径 + 基础路径
python
adapter = LocalAdapter(base_path="/data")
df = adapter.read_csv("stocks/600000.csv")
# 实际读取: /data/stocks/600000.csv动态路径
python
import os
base = os.path.dirname(__file__)
data_path = os.path.join(base, "data")
adapter = LocalAdapter(base_path=data_path)数据处理示例
读取后处理
python
reader = CSVReader(base_path="/data")
df = reader.read_with_date_parse("stock_600000.csv")
df["returns"] = df["close"].pct_change()
df["MA5"] = df["close"].rolling(5).mean()
df["MA10"] = df["close"].rolling(10).mean()
reader.write_csv(df, "stock_600000_processed.csv")合并多个数据源
python
reader = CSVReader(base_path="/data")
stocks = ["600000", "600036", "601318"]
dfs = []
for code in stocks:
df = reader.read(f"{code}.csv")
if df is not None:
df["code"] = code
dfs.append(df)
combined = pd.concat(dfs, ignore_index=True)常见问题
1. 中文字符乱码
解决方案: 指定正确的编码
python
df = adapter.read_csv("data.csv", encoding="gbk")2. 日期列无法解析
解决方案: 检查日期格式或手动指定
python
df = reader.read_with_date_parse("data.csv", date_format="%Y/%m/%d")3. 文件太大读取慢
解决方案: 分块读取
python
for chunk in pd.read_csv("large_file.csv", chunksize=10000):
process(chunk)