Pastor Soto
Pastor Soto

Reputation: 386

How can I return two variables from a function on python 3?

I have this dataframe:

df.head()
                         Open      High       Low     Close  Volume  day_month
2006-04-13 10:00:00   1921.75   1922.00   1918.00   1918.25   11782 2006-04-13
2006-04-13 10:30:00   1918.25   1931.75   1918.00   1931.00   39744 2006-04-13
2006-04-13 11:00:00   1931.25   1934.00   1929.00   1930.25   34385 2006-04-13
2006-04-13 11:30:00   1930.50   1932.00   1928.50   1931.25   13539 2006-04-13
2006-04-13 12:00:00   1931.25   1932.25   1928.25   1928.75   10045 2006-04-13


df.tail()

                         Open      High       Low     Close  Volume  day_month
2021-06-18 14:30:00  14077.50  14085.25  14033.00  14039.00   19573 2021-06-18
2021-06-18 15:00:00  14039.00  14085.50  14023.50  14077.00   27464 2021-06-18
2021-06-18 15:30:00  14077.00  14092.75  14028.75  14041.75   39410 2021-06-18
2021-06-18 16:00:00  14041.75  14049.00  14019.50  14042.75   17071 2021-06-18
2021-06-18 16:30:00  14040.00  14042.25  14015.00  14017.75    3167 2021-06-18

df.info()

<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 57233 entries, 2006-04-13 10:00:00 to 2021-06-18 16:30:00
Data columns (total 6 columns):
 #   Column     Non-Null Count  Dtype         
---  ------     --------------  -----         
 0   Open       57233 non-null  float64       
 1   High       57233 non-null  float64       
 2   Low        57233 non-null  float64       
 3   Close      57233 non-null  float64       
 4   Volume     57233 non-null  int32         
 5   day_month  57233 non-null  datetime64[ns]
dtypes: datetime64[ns](1), float64(4), int32(1)

I am using marketprofile package to create a function and I want to store the output into different variables

from market_profile import MarketProfile

I create this function to store the values

def mp_va(df):
    mp = MarketProfile(df, tick_size = 0.25)
    mp_slice = mp[df.index.min():df.index.max()]
    
    return mp_slice.value_area[0], mp_slice.value_area[1], mp_slice.poc_price 

I want to store the three output into a data frame in python for all days in my dataset

Using the below code I applied the function I just create into all days in my data frame

df_mp = df.groupby(['day_month']).apply(mp_va)

This was the output:

df_mp

day_month
2006-04-13        (1927.5, 1931.25, 1930.25)
2006-04-17          (1898.5, 1922.5, 1898.5)
2006-04-18       (1923.75, 1938.25, 1935.25)
2006-04-19        (1935.75, 1941.25, 1936.5)
2006-04-20       (1939.25, 1941.75, 1939.25)
                           ...              
2021-06-14      (13998.75, 14055.5, 14021.0)
2021-06-15    (14030.25, 14097.25, 14097.25)
2021-06-16      (13916.5, 14016.5, 13922.75)
2021-06-17     (14024.75, 14160.0, 14024.75)
2021-06-18       (14052.0, 14106.5, 14096.5)
Length: 3913, dtype: object

This was one of the suggestions:

def mp_va(df):
    global df_2
    mp = MarketProfile(df, tick_size = 0.25)
    mp_slice = mp[df.index.min():df.index.max()]
    
    data =  {mp_slice.value_area[0], mp_slice.value_area[1], mp_slice.poc_price}
    df_2 = pd.DataFrame(data)
    return df_2

df_mp = df.groupby(['day_month']).apply(mp_va)

df_mp

The output for this code was:

                     0
day_month             
2006-04-13 0   1930.25
           1   1931.25
           2   1927.50
2006-04-17 0   1898.50
           1   1922.50
...                ...
2021-06-17 0  14024.75
           1  14160.00
2021-06-18 0  14096.50
           1  14106.50
           2  14052.00

[10202 rows x 1 columns]
ValueError: not enough values to unpack (expected 3, got 1)

Detailed traceback: 
  File "<string>", line 1, in <module>

This was my first attempt to create the data frame with all three variables by unpacking

va_high, va_low, op_price = df_mp

This is the output from that code which gives me an error

ValueError: too many values to unpack (expected 3)

I also tried:

def mp_va(df):
    mp = MarketProfile(df, tick_size = 0.25)
    mp_slice = mp[df.index.min():df.index.max()]
    
    data =  {mp_slice.value_area[0], mp_slice.value_area[1], mp_slice.poc_price}

But this code gives me an error:

ValueError: not enough values to unpack (expected 2, got 0)

I also tried this:

def mp_va(df):
    global df_2
    mp = MarketProfile(df, tick_size = 0.25)
    mp_slice = mp[df.index.min():df.index.max()]
    
    data =  {mp_slice.value_area[0], mp_slice.value_area[1], mp_slice.poc_price}
    df_2 = pd.DataFrame(data)

df_mp = df.groupby(['day_month']).apply(mp_va)

va_high, va_low, op_price = df_mp

But this gives me an error message:

ValueError: not enough values to unpack (expected 3, got 0)

My question is: Is there a way to store the values of the three outputs in a data frame from the above function?

The expected output will be:


             va_low  va_high  op_price   
2006-04-13   1927.5  1931.25   1930.25
2006-04-17   1898.5  1922.5    1934.50 

Upvotes: 0

Views: 98

Answers (1)

Pythonics
Pythonics

Reputation: 122

I'm not able to test this at the time, but based on the traceback; Your function isn't returning any values which is why it states (expected 3, got 0) if you add return df_2 to the end of mp_va() function, it should fix your issue

def mp_va(df):
    global df_2
    mp = MarketProfile(df, tick_size = 0.25)
    mp_slice = mp[df.index.min():df.index.max()]

    data =  {mp_slice.value_area[0], mp_slice.value_area[1], mp_slice.poc_price}
    df_2 = pd.DataFrame(data)
    return df_2

UPDATE: the below code now works

def mp_va(df): 
    global df_2 
    mp = MarketProfile(df, tick_size = 0.25) 
    mp_slice = mp[df.index.min():df.index.max()] data = {'vn Low': 
    [mp_slice.value_area[0]], 'vn High' : [mp_slice.value_area[1]], 'op Price': [mp_slice.poc_price]} 

    df_2 = pd.DataFrame(data) 
    return df_2 

df_map =  df.groupby(['day_month']).apply(mp_va)

Upvotes: 2

Related Questions