#python #pandas #dataframe
#python #pandas #фрейм данных
Вопрос:
Я создал функцию для возврата множества переменных из электронной таблицы. Я попытался вернуться в фрейм данных pandas вместо кортежа и получил результат. Проблема в том, что он возвращает заголовки через каждую отдельную строку (см. Рисунок). Извините, если это легко исправить, я совсем новичок! Спасибо!
В:
holdings_darray = ['01-03-2020','01-06-2020','01-07-2020','01-08-2020','01-09-2020','01-11-2020','01-14-2020','01-15-2020','01-17-2020','01-21-2020','01-22-2020','01-23-2020',
'01-24-2020','01-27-2020','01-28-2020','01-29-2020','01-30-2020','01-31-2020','02-04-2020']
def get_holdings_info(d):
date = 0
sbhmv = 0
sbhbv = 0
sbhs = 0
setfhmv = 0
setthbv = 0
setfhs = 0
smmhmv = 0
smmhbv = 0
smmhs = 0
r = open('holdings/Holdings As Of ' d '.csv', 'r')
line = r.readline()
holdings_date = line[13:21]
date = datetime.datetime.strptime(holdings_date, "%Y%m%d")
holdings_file = 'holdings/Holdings As Of ' d '.csv'
df = pd.read_csv(holdings_file, header=1)
df = df.applymap(lambda x: x.strip() if isinstance(x, str) else x)
account_names = ["fund1", "fund2"]
bond_name = ["Bond Paying Periodic Income"]
money_market_name = ["Money Market Fund"]
mutual_fund_name = ["Mutual Fund"]
sbh = df[df["Account Name"].isin(account_names) amp; df["Security Type Name"].isin(bond_name)]
sbhmv = sbh['Market Value'].sum()
sbhbv = sbh['Book Value'].sum()
sbhs = sbh['Shares'].sum()
setfh = df[df["Account Name"].isin(account_names) amp; df["Security Type Name"].isin(mutual_fund_name)]
setfhmv = setfh['Market Value'].sum()
setthbv = setfh['Book Value'].sum()
setfhs = setfh['Shares'].sum()
smmh = df[df["Account Name"].isin(account_names) amp; df["Security Type Name"].isin(money_market_name)]
smmhmv = smmh['Market Value'].sum()
smmhbv = smmh['Book Value'].sum()
smmhs = smmh['Shares'].sum()
return pd.DataFrame({'Date': [date], 'Bond Market Value':[sbhmv], 'Bond Book Value':[sbhbv], 'Bond Shares':[sbhs], 'ETF Market Value': [setfhmv], 'ETF Book Value' : [setthbv], 'ETF Shares': [setfhs], 'Money Market Market Value':[smmhmv], 'Money Market Book Value': [smmhbv], 'Money Market Shares':[smmhs]}
, columns=['Date', 'Bond Market Value', 'Bond Book Value', 'Bond Shares', 'ETF Market Value', 'ETF Book Value', 'ETF Shares', 'Money Market Market Value', 'Money Market Book Value', 'Money Market Shares'])
def get_holdings_info_array():
c = []
for f in holdings_darray:
c.append(get_holdings_info(f))
return(c)
print(get_holdings_info_array())
Ответ №1:
Ну, дело в том, что вы записываете несколько фреймов данных в свой список c
. Если вы распечатаете его, он покажет вам все перечисленные фреймы данных. Вместо этого вы могли бы добавить их в один фрейм данных:
def get_holdings_info_array():
c = pd.DataFrame()
for f in holdings_darray:
c = c.append(get_holdings_info(f), ignore_index=True)
return(c)
Комментарии:
1.
TypeError: cannot concatenate object of type '<class 'datetime.datetime'>'; only Series and DataFrame objs are valid
это то, что я получил от этого2. ну, в таком случае ваша функция, похоже, не возвращает фрейм данных .. можете ли вы показать мне, что именно
get_holdings_info(f)
возвращает? И какой это тип?
Ответ №2:
привет, вы должны попробовать этот код
df = pd.DataFrame([date,sbhmv,sbhbv,sbhs,setfhmv,setthbv,setfhs,smmhmv,smmhbv,smmhs])
df = df.T
df.columns =['Date',
'Bond Market Value',
'Bond Book Value',
'Bond Shares',
'ETF Market Value',
'ETF Book Value',
'ETF Shares',
'Money Market Market Value',
'Money Market Book Value',
'Money Market Shares']
return df
вместо :
return pd.DataFrame({'Date': [date], 'Bond Market Value':[sbhmv], 'Bond Book Value':[sbhbv], 'Bond Shares':[sbhs], 'ETF Market Value': [setfhmv], 'ETF Book Value' : [setthbv], 'ETF Shares': [setfhs], 'Money Market Market Value':[smmhmv], 'Money Market Book Value': [smmhbv], 'Money Market Shares':[smmhs]}
, columns=['Date', 'Bond Market Value', 'Bond Book Value', 'Bond Shares', 'ETF Market Value', 'ETF Book Value', 'ETF Shares', 'Money Market Market Value', 'Money Market Book Value', 'Money Market Shares'])
Комментарии:
1.
ValueError: Shape of passed values is (10, 1), indices imply (10, 10)
это то, что у меня есть2. замените columns = [«Date», …] на index = [‘Дата»,…]
Ответ №3:
Я думаю, вам нужен фрейм данных из 2 строк и 10 столбцов, отображающих значения. Поэтому вам придется использовать
data = [date,sbhmv,sbhbv,sbhs,setfhmv,setthbv,setfhs,smmhmv,smmhbv,smmhs]
columns = ['Date','Bond Market Value','Bond Book Value','Bond Shares','ETF Market Value','ETF Book Value', 'ETF Shares','Money Market Market Value','Money Market Book Value','Money Market Shares']
df = pd.DataFrame(data, columns)
вместо:
pd.DataFrame({'Date': [date], 'Bond Market Value':[sbhmv], 'Bond Book Value':[sbhbv], 'Bond Shares':[sbhs], 'ETF Market Value': [setfhmv], 'ETF Book Value' : [setthbv], 'ETF Shares': [setfhs], 'Money Market Market Value':[smmhmv], 'Money Market Book Value': [smmhbv], 'Money Market Shares':[smmhs]}
, columns=['Date', 'Bond Market Value', 'Bond Book Value', 'Bond Shares', 'ETF Market Value', 'ETF Book Value', 'ETF Shares', 'Money Market Market Value', 'Money Market Book Value', 'Money Market Shares'])