将几个Pandas系列组合成数据帧的功能

时间:2018-03-20 21:44:41

标签: python pandas dataframe

我有一个财务值的数据框(df_price)。我在其中一个数据帧的列/系列中计算移动平均值(使用一个简单的函数MA),然后创建一个新的数据帧(df_indicators),其中包含每个移动的数据帧作为列/系列的平均值。

我必须针对许多不同的指标和数据框重复执行相同的基本操作,因此我想创建一个函数(称之为bundle_indicators)来执行此操作。

基本上,我想用三个参数调用bundle_indicators

  1. 指标名称列表
  2. 每个指标的值列表(或系列),
  3. df_price以便bundle_indicators在创建数据框时可以使用它的索引。
  4. 我希望bundle_indicators返回一个数据框,其中每个列/系列都以其中一个指标命名,每行/索引代表该指标的值。

    以下是我目前的工作方式。它运行没有错误,但我想用函数替换最后一个段落。我已经尝试了所有我能想到但却得到错误的东西,通常与传递参数有关。我非常感谢任何人的帮助,因为我已经有很长一段时间了。

    import numpy as np
    import pandas as pd
    
    
    # Create a new dataframe
    df_price = pd.DataFrame({
        'Date': ['1993.01.29', '1993.02.01', '1993.02.02', '1993.02.03', '1993.02.04', '1993.02.05', '1993.02.08', '1993.02.09', '1993.02.10', '1993.02.11'], 
        'Open': [43.80, 43.80, 44.05, 44.17, 44.67, 43.80, 44.05, 44.17, 44.67, 44.92], 
        'High': [43.80, 44.05, 44.17, 44.67, 44.92, 43.80, 43.80, 44.05, 44.17, 44.67], 
        'Low': [43.55, 43.80, 43.92, 44.17, 44.55, 43.80, 44.05, 44.17, 44.55, 44.89], 
        'Close': [43.80, 44.05, 44.17, 44.55, 44.89, 43.55, 43.80, 43.92, 44.17, 44.55],
        'Volume': [1007786, 482696, 202220, 531820, 533930, 1007786, 482696, 202220, 531820, 533930]
    })
    
    
    # Moving Average funtion
    def MA(lb, frame):
        prices = frame['Close']
        mavg = []
    
        for i in range(len(prices)):
            if i < lb:
                mavg.append(0)
            else:
                sum_array = prices[(i - lb): (i + 1)] 
                mavg.append(np.mean(sum_array))
        return mavg
    
    
    # Calculate the moving average for three different lookback periods: 1, 2, 4
    mavg_fast = MA(1, df_price)
    mavg_med = MA(2, df_price)
    mavg_slow = MA(4, df_price)
    
    # Create a new df_indicators dataframe, using df_price's index
    # TODO REPLACE THIS WITH A FUNCTION THAT RETURNS A DATAFRAME 
    df_indicators = pd.DataFrame({'mavg_fast': mavg_fast}, index = df_price.index)
    df_indicators = df_indicators.assign(mavg_med= mavg_med)
    df_indicators = df_indicators.assign(mavg_slow = mavg_slow)
    
    print(df_indicators)
    

2 个答案:

答案 0 :(得分:0)

看起来好像最终得到的数据列表与数据帧的长度相同。您只需执行df_price['new_column']=list_of_values即可将这些值指定为数据框中的新列 这可能是你需要的。

答案 1 :(得分:0)

考虑使用字典理解构建您的数据框,以便传递到DataFrame()调用,其中您使用{{1}遍历指标名称值列表元素并映射键和值以作为列和行进行迁移:

zip