第1关:大数据文件分块读取技术、二分法查找

def find_index(A,a0,a2):

    tA=A

    while 1:

      I1=int(len(tA)/2)-1

      I2=I1+1

      t0=int(tA.iloc[I1,0][8:10])

      t2=int(tA.iloc[I2,0][8:10])

      if  t2!=t0:

         r=(tA.iloc[I1,0],tA.index[I1])

         return r

         break

      if t2==t0 and t2==a0: 

          tA=tA.iloc[I2:,:]

      if t2==t0 and t2==a2:

          tA=tA.iloc[:I1+1,:]

def return_values():

    import pandas  as pd

    reader =pd.read_csv('159站点8月份刷卡数据.csv',sep=',',chunksize=10000,usecols=[1],engine='python')

    #每个月最后一天,没有与之比较,故每月最后一天无法获得,通过取数据及最后一条记录即可

    r_d=[]

    for A in reader:

        a0=int(A.iloc[0,0][8:10])

        a2=int(A.iloc[len(A)-1,0][8:10])

        if a0!=a2:

           r=find_index(A,a0,a2)

           r_d.append(r)

    return r_d

第2关地铁进站人数和出站人数统计计算

#在上一关的基础上,利用每天最后一条刷卡记录的行标号,
#统计获得159站点每天的进站人数和出站人数,结果用一个数据框df来表示,字段名称依次为:
#A1_日期、A2_进站人数、A3_出站人数
import step9_1
r = step9_1.return_values()
def return_values():
    import pandas as pd

    A=pd.read_csv('159站点8月份刷卡数据.csv',sep=',',engine='python')

    A1=[]

    A2=[]

    A3=[]

    for i in range(len(r)):

        A1.append(r[i][0][:10])

        if i==0:

            At=A.iloc[:r[i][1]+1,:]

            A2.append(len(At.iloc[At.iloc[:,0].values==21,:]))

            A3.append(len(At.iloc[At.iloc[:,0].values==22,:]))

        if i>0:

            At=A.iloc[r[i-1][1]+1:r[i][1]+1,:]

            A2.append(len(At.iloc[At.iloc[:,0].values==21,:]))

            A3.append(len(At.iloc[At.iloc[:,0].values==22,:]))

    A1.append('2015-08-31') 

    At=A.iloc[r[len(r)-1][1]+1:,:] 

    A2.append(len(At.iloc[At.iloc[:,0].values==21,:]))

    A3.append(len(At.iloc[At.iloc[:,0].values==22,:]))

    D={'A1_日期':A1,'A2_进站人数':A2,'A3_出站人数':A3}

    df=pd.DataFrame(D)
    return df

第3关天气、周末、节假日数据指标设计及计算

# -*- coding: utf-8 -*-
import pandas as pd
 
def return_values():
    # 读取数据表
    df = pd.read_excel("星期、天气、节假日数据.xlsx")
    
    # 获取所有列名
    cols = df.columns.tolist()
    
    # 智能匹配列名(关键词查找)
    date_col = next((c for c in cols if "日期" in c), cols[0])
    week_col = next((c for c in cols if "星期" in c), cols[1])
    # 节假日列:找包含"节"/"假"/"holiday"的列,找不到就用第3列兜底
    holiday_col = next((c for c in cols if "节" in c or "假" in c or "holiday" in c.lower()), cols[2])
    temp_col = next((c for c in cols if "温" in c or "度" in c), cols[3])
    weather_col = next((c for c in cols if "天气" in c or "雨雪" in c), cols[4])
    
    # 初始化结果数据框
    data = pd.DataFrame()
    
    # A1_日期
    data["A1_日期"] = df[date_col]
    
    # A2_星期值:星期一~星期四=0;星期五=0.5;周末=1
    def week_val(x):
        x = str(x).strip()
        if x in ["星期一", "星期二", "星期三", "星期四"]:
            return 0
        elif x == "星期五":
            return 0.5
        else:  # 星期六、星期日
            return 1
    data["A2_星期值"] = df[week_col].apply(week_val)
    
    # A3_节假日:中秋、国庆=1;其他节假日=0.5;非节假日=0
    def holiday_val(x):
        x = str(x).strip()
        if x in ["中秋节", "国庆节"]:
            return 1
        elif x == "非节假日" or x == "" or x == "nan":
            return 0
        else:
            return 0.5
    data["A3_节假日"] = df[holiday_col].apply(holiday_val)
    
    # A4_气温:>=10度为1,否则为2
    data["A4_气温"] = df[temp_col].apply(lambda x: 1 if float(x) >= 10 else 2)
    
    # A5_雨雪:晴/阴/多云/转晴/转多云=1;小雨/阵雨/转小雨/转阵雨=2;其他=3
    def weather_val(x):
        x = str(x).strip()
        if x in ["晴", "阴", "多云", "转晴", "转多云"]:
            return 1
        elif x in ["小雨", "阵雨", "转小雨", "转阵雨"]:
            return 2
        else:
            return 3
    data["A5_雨雪"] = df[weather_col].apply(weather_val)
    
    return data

第4关因变量和自变量数据的融合计算

# 获得第2关的每日进站人数和出站人数数据,和第3关的每日影响因素指标值
# 以日期作为关联字段,进行内连接,获得完整的因变量和自变量数据df(数据框)
def return_values():
    import step9_2
    import step9_3
    import pandas as pd
    r=step9_2.return_values()
    r1=step9_3.return_values()
    df=pd.merge(r1,r,how='inner',on=['A1_日期'])
    return df

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐