我需要帮助 - 我花了一整天(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))
我知道这是一个非常深入的问题,但我真的很感激任何人都能提供的帮助或指导。我一直在阅读大量其他帖子,但如果您认为他们会有所帮助,请随意分享一些。谢谢你的帮助!
答案 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内置库来提高效率或代码。即如何获得独特的日期,如何转换日期