熊猫数据框,组织和计算

时间:2017-09-08 00:34:43

标签: python python-2.7 pandas dataframe

我需要帮助 - 我花了一整天(14个多小时)试图为我制作的测试文件设置一个熊猫数据帧。我的真实文件是一个数百万行的csv,所以我试图找到最快速,最有效的数据处理方式。我需要做的是计算物品清单价格的年度变化。

在删除不需要的列后,我的数据看起来像这样:

Item    Price   As of Date
Item 1  1.08908 4/13/2016
Item 2  2.03281 4/13/2016
Item 3  3.02619 4/13/2016
Item 1  1.56743 12/21/2015
Item 3  12.31867    12/21/2015
Item 2  0.98066 12/21/2015
Item 4  0.31701 12/21/2015
Item 3  0.6251  3/31/2015
Item 1  6.87538 3/31/2015
Item 2  0.3113  3/31/2015
Item 4  0.18724 3/31/2015

首先,我需要将数据转换为可以进行年度计算的方式。它按项目,价格和截止日期的列排列。我需要以某种方式安排数据并计算每个给定的日期,每年所列项目的价格变化百分比。然后找出每个日期的平均变化。

以下是我试图安排数据的方法,但我无法确定哪种方式最好,然后如何计算y / y变化。

import pandas as pd
import datetime as dt
import numpy as np

df = pd.read_csv('...python test file.csv')
asofdate = set ()

#sorting the dataframe chronologically by As of Date
df.sort_values(df.columns[11])

asofdate = list(df.apply(set)[11])
asofdate = [dt.datetime.strptime(date, '%m/%d/%Y').date() for date in asofdate]

#attempt 1
df = df.set_index("As of Date")
df = df[['Item','Price_Per_Unit']]

#attempt 2
df2 = df.pivot_table('Price_Per_Unit',['Item'], 'As of Date')

#date of lastupdate
lastupdated = df2.iloc[:,-1]

我必须处理不完全年份的日期是以下函数(在stackexchange上找到)以找到最近的日期:

def nearest(items, pivot):
    return min(items, key=lambda x: abs(x - pivot))

我知道这是一个非常深入的问题,但我真的很感激任何人都能提供的帮助或指导。我一直在阅读大量其他帖子,但如果您认为他们会有所帮助,请随意分享一些。谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

不确定我对您的问题的理解是否正确,请查看下面的代码段。

import pandas as pd
import numpy as np
import sys
if sys.version_info[0] < 3: 
    from StringIO import StringIO
else:
    from io import StringIO



def get_prev_year_price(x, df):
    try:
        return df.loc[x['prev_year_date'], 'price']
    except Exception as e: #not recommended to write in this way...just for demo
        return x['price']


TESTDATA=StringIO("""Item   price   date
Item 1  1.08908 4/13/2016
Item 2  2.03281 4/13/2016
Item 3  3.02619 4/13/2016
Item 1  1.56743 12/21/2015
Item 3  12.31867    12/21/2015
Item 2  0.98066 12/21/2015
Item 4  0.31701 12/21/2015
Item 3  0.6251  3/31/2015
Item 1  6.87538 3/31/2015
Item 2  0.3113  3/31/2015
Item 4  0.18724 3/31/2015""")

df = pd.read_csv(TESTDATA, sep="\t")


df['date'] = pd.to_datetime(df['date'],format='%m/%d/%Y')


data = []
for item in df['Item'].unique():
    item_df = df[df['Item'] == item] #select based on items
    select_dates = item_df['date'].unique()
    item_df.set_index('date', inplace=True) #set date as key index
    item_df = item_df.resample('D').mean().reset_index() #fill in missing date
    item_df['price'] = item_df['price'].interpolate('nearest') #fill in price with nearest price available
    item_df['prev_year_date'] = item_df['date'] - pd.DateOffset(years=1) #calculate 1 year ago date
    date_df = item_df[item_df.date.isin(select_dates)] #select datas with useful data
    item_df.set_index('date', inplace=True)
    date_df['prev_year_price'] = date_df.apply(lambda x: get_prev_year_price(x, item_df),axis=1)
    date_df['change'] = date_df['price'] / date_df['prev_year_price']-1
    date_df['Item'] = item
    data.append(date_df)
summary = pd.concat(data).sort_values('date')
print (summary)

结果为:

          date     price prev_year_date  prev_year_price    change    Item
0   2015-03-31   6.87538     2014-03-31          6.87538  0.000000  Item 1
0   2015-03-31   0.31130     2014-03-31          0.31130  0.000000  Item 2
0   2015-03-31   0.62510     2014-03-31          0.62510  0.000000  Item 3
0   2015-03-31   0.18724     2014-03-31          0.18724  0.000000  Item 4
265 2015-12-21   1.56743     2014-12-21          1.56743  0.000000  Item 1
265 2015-12-21   0.98066     2014-12-21          0.98066  0.000000  Item 2
265 2015-12-21  12.31867     2014-12-21         12.31867  0.000000  Item 3
265 2015-12-21   0.31701     2014-12-21          0.31701  0.000000  Item 4
379 2016-04-13   1.08908     2015-04-13          6.87538 -0.841597  Item 1
379 2016-04-13   2.03281     2015-04-13          0.31130  5.530067  Item 2
379 2016-04-13   3.02619     2015-04-13          0.62510  3.841129  Item 3

顺便说一句,您可以通过阅读pandas内置库来提高效率或代码。即如何获得独特的日期,如何转换日期