feat(uniswap-v2): add support for uniswap v2 positions

This commit is contained in:
2025-09-27 11:00:35 +08:00
commit 1eed2c4a61
8 changed files with 557 additions and 0 deletions

88
uniswap-v2/merge.py Normal file
View File

@@ -0,0 +1,88 @@
import os
import csv
from decimal import Decimal
from datetime import datetime
def merge_portfolio_files():
data_dir = "data"
if not os.path.exists(data_dir):
print(f"目录 {data_dir} 不存在")
return
portfolio_files = []
for filename in os.listdir(data_dir):
if filename.startswith("portfolio_") and filename.endswith(".csv"):
portfolio_files.append(filename)
if not portfolio_files:
print("未找到portfolio_*.csv文件")
return
for input_filename in portfolio_files:
output_filename = input_filename.replace("portfolio_", "merged_")
input_path = os.path.join(data_dir, input_filename)
output_path = os.path.join(data_dir, output_filename)
try:
process_single_file(input_path, output_path)
print(f"成功处理: {input_filename} -> {output_filename}")
except Exception as e:
print(f"处理文件 {input_filename} 时出错: {e}")
def process_single_file(input_path, output_path):
date_data = {} # 格式: {日期: {'amount': 净额总和, 'last_time': 最后时间}}
with open(input_path, "r", encoding="utf-8") as infile:
reader = csv.DictReader(infile)
if not all(field in reader.fieldnames for field in ["日期", "类型", "净额"]):
raise ValueError("CSV文件格式不正确需要的列日期,类型,净额")
for row in reader:
full_datetime_str = row["日期"]
try:
full_datetime = datetime.fromisoformat(
full_datetime_str.replace("Z", "+00:00")
)
except ValueError:
print(f"警告:跳过无效的日期格式: {full_datetime_str}")
continue
date_only = full_datetime.date().isoformat()
try:
amount = Decimal(row["净额"])
except ValueError:
print(f"警告:跳过无效的净额值: {row['净额']}")
continue
if date_only in date_data:
date_data[date_only]["amount"] += amount
if full_datetime > date_data[date_only]["last_time"]:
date_data[date_only]["last_time"] = full_datetime
else:
date_data[date_only] = {"amount": amount, "last_time": full_datetime}
sorted_dates = sorted(date_data.keys())
with open(output_path, "w", encoding="utf-8", newline="") as outfile:
writer = csv.writer(outfile)
writer.writerow(["日期", "类型", "净额"])
for date in sorted_dates:
data = date_data[date]
last_datetime_str = data["last_time"].strftime("%Y-%m-%dT%H:%M")
writer.writerow([last_datetime_str, "利息", data['amount']])
def main():
"""主函数"""
print("开始处理portfolio文件...")
merge_portfolio_files()
print("处理完成!")
if __name__ == "__main__":
main()