from openpyxl import load_workbook
import pandas as pd
import datetime
from openpyxl import Workbook
from openpyxl.utils.dataframe import dataframe_to_rows

# 打开Excel文件
wb = load_workbook(filename=r'C:\Users\LIQI\Documents\民生基金\行业打分\钢铁数据跟踪汇总.xlsx', read_only=True, data_only=True)

# 选择指定的sheet
sheet = wb['吨钢毛利']  # 这里的Sheet3是你要读取的sheet名称，可以根据实际情况修改

# 选择指定的列
columns = [0, 9, 10, 11, 12]

# 读取数据
data = []
for row in sheet.iter_rows(values_only=True):
    if all(value is None for value in row):
        break
    data.append([row[column] for column in columns])

# 构建DataFrame
df = pd.DataFrame(data)
df.columns = df.iloc[0]
df = df[1:]

# 将第一列作为索引并转换为datetime格式
df.set_index(df.columns[0], inplace=True)
df.index = pd.to_datetime(df.index)

def calculate_percentile(df, date, column):
    date = pd.to_datetime(date)
    target_dates = pd.date_range(end=date, periods=5)
    target_values = df.loc[target_dates, column]
    target_value_mean = target_values.mean()

    five_years_ago = date - pd.DateOffset(years=6)    
    date_range = pd.date_range(start=five_years_ago, end=date)
    history_values = df.loc[date_range, column]

    # Calculate smoothed values
    history_means = history_values.rolling(window=5).mean()
    # Filter out the same month and day values
    history_values = df[(df.index.month.isin(date_range.month)) & (df.index.day.isin(date_range.day))][column]

    target_smoothed_value = target_value_mean
    max_smoothed_value = history_means.max()
    min_smoothed_value = history_means.min()

    percentile = (target_smoothed_value - min_smoothed_value) / (max_smoothed_value - min_smoothed_value) * 100

    return percentile


# 创建一个空的列表，用于存储每一天的percentile值
percentiles = []

# 设置起始日期
start_date = pd.to_datetime('2018-12-31')

# 循环遍历DataFrame的每一行
for index, row in df.iterrows():
    # 检查是否满足起始日期的条件，如果不满足，则跳过计算
    if index < start_date:
        percentiles.append(None)
        continue
    
    # 获取当前行的日期和列名
    date = index
    column = '螺纹钢'  # 要计算percentile的列名，请根据实际情况修改

    # 调用calculate_percentile函数计算percentile值
    percentile = calculate_percentile(df, date, column)
    
    # 将percentile值添加到列表中
    percentiles.append(percentile)
df['Percentile'] = percentiles



# 创建一个空的列表，用于存储每一天的Percentile YOY值
percentile_yoy = []

# 循环遍历DataFrame的每一行
for index, row in df.iterrows():
    # 检查是否满足起始日期的条件，如果不满足，则跳过计算
    if index < start_date:
        percentile_yoy.append(None)
        continue
    
    # 获取当前行的日期和列名
    date = index
    column = '螺纹钢'  # 要计算Percentile YOY的列名，请根据实际情况修改

    # 获取上一年同期的日期
    last_year_date = date - pd.DateOffset(years=1)

    # 检查上一年同期的日期是否在DataFrame中存在
    if last_year_date in df.index:
        # 计算上一年同期的Percentile值
        last_year_percentile = df.loc[last_year_date, 'Percentile']
        # 计算Percentile YOY值
        percentile_yoy_value = row['Percentile'] - last_year_percentile
        percentile_yoy.append(percentile_yoy_value)
    else:
        percentile_yoy.append(None)

# 将percentile_yoy列表添加为新的一列到DataFrame中
df['Percentile YOY'] = percentile_yoy


# 创建一个空的列表，用于存储每一天的Percentile WOW值
percentile_wow = []

# 循环遍历DataFrame的每一行
for index, row in df.iterrows():
    # 检查是否满足起始日期的条件，如果不满足，则跳过计算
    if index < start_date:
        percentile_wow.append(None)
        continue
    
    # 获取当前行的日期和列名
    date = index
    column = '螺纹钢'  # 要计算Percentile YOY的列名，请根据实际情况修改

    # 获取两周前的日期
    two_weeks_ago = date - pd.DateOffset(weeks=2)

    # 检查两周前的日期是否在DataFrame中存在
    if two_weeks_ago in df.index:
        # 计算两周前的的Percentile值
        two_weeks_ago_percentile = df.loc[two_weeks_ago, 'Percentile']
        # 计算Percentile WOW值
        percentile_wow_value = row['Percentile'] - two_weeks_ago_percentile
        percentile_wow.append(percentile_wow_value)
    else:
        percentile_wow.append(None)

# 将percentile_wow列表添加为新的一列到DataFrame中
df['Percentile WOW'] = percentile_wow


# 创建一个新的工作簿
new_wb = Workbook()

# 获取新工作簿的默认sheet
new_sheet = new_wb.active

# 将DataFrame的数据逐行写入新sheet
for r in dataframe_to_rows(df, index=True, header=True):
    new_sheet.append()

# 设置新sheet的名称
new_sheet.title = "数据分析结果"
运行以后错误信息如下 怎么改？
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_1100/3893421799.py in <module>
    150 # 将DataFrame的数据逐行写入新sheet
    151 for r in dataframe_to_rows(df, index=True, header=True):
--> 152     new_sheet.append()
    153 
    154 # 设置新sheet的名称

TypeError: append() missing 1 required positional argument: 'iterable'