sehHeiden
I have a DataFrame Value columns and a Column with a start date (NaiveDateTime) and an end date (NaiveDateTime) at which the values where meassured. I would like to “unroll” the dateframe so that, I get a row for every date (day of the year), for every sample in the data frame.
I know, how I would do it in pandas (perhaps not the most elegant solution).
I would compute the day of the year (day) of the start and end dates, construct a list of every doy withing this range as a new column and than explode to return t 1st NF and that it is.
How would I do that with Explorer?
I started with:
filtered_polls = polls
|> DF.filter(start_date >= ^start_date)
polls_timeline = filtered_polls
|> DF.put("start_day", S.day_of_year(filtered_polls["start_date"]))
|> DF.put("end_day", S.day_of_year(filtered_polls["end_date"]))
polls_timeline
|> DF.put("date_range", polls_timeline["start_day"]..polls_timeline["end_day"])
|> DF.print()
Which is due to the range can not work on two series. But un two zipped lists.
dates = polls_timeline["start_day"]
|> S.to_list()
|> Enum.zip(S.to_list(polls_timeline["end_day"]))
|> Enum.map(fn {start_date, end_date} -> start_date..end_date end)
|> Enum.map(&Enum.to_list(&1))
polls_timeline
|> DF.put("dates", dates)
|> DF.print()
Which does not work. Because I can not add a list as data type. Next I still would not know how to unroll.
Trending in Questions
Other Trending Topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #library
- #deployment
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #elixirconf
- #channels
- #exunit
- #discussion
- #code-sync
- #podcasts
- #javascript
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #ai
- #elixirconf-us
- #blog-post
- #elixir-ls
- #phoenix_html
- #iex
- #graphql
- #genstage
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #hex
- #security
- #metaprogramming










Showing Posts 14 to 5- Show Best Posts
- Show All (oldest first)
- Show All (newest first)
sehHeiden
Thanks for you help. You completly deconstructed it computed the inner list and than made a new DataFrame.
I think, we don’t have to do everything, like others do, but it has to make sense within its inner logic.
billylanchantin
Thank you! That makes it much easier to answer.
So I think @josevalim’s answer was what you want (for now, see below):
Also, I don’t want to speak for the core team, but
explodedoes appear to be on the roadmap:https://github.com/elixir-explorer/explorer/issues/296
So if/when that functionality is added, you can do a nearly one-to-one translation of the Pandas code.
sehHeiden
@billylanchantin I just checked Polars also can do that. Polars Explode
But it’s not in the explorer documentation, olso the types list and array…
Am I right?
sehHeiden
@billylanchantin I did it in Python Pandas and ilustrate it with some images.
I start with a DataFrame with start and Enddates and some values:
Than I add a column (last column), that holds the days from start to end date:
You see the brackets. Which implies the list. Than I “explode” the DataFrame. So that from any value in the list, the other row values are copied and the row-exists n times.
The image shows that line zero exists now 5 times, as the list in column
dayis exploded.Here is the python code:
How would I reach the result in Explorer?
billylanchantin
I’m taking some liberties to illustrate the idea.
A few points:
If you show exactly what computation you’re trying to accomplish, I could say more. But the above is what I meant by “grouping/etc”.
sehHeiden
@billylanchantin I musst be afk and try clear the problem from remote as good as I can.
What I meant is, the original DataFrame has about ten entries.
Than I take the dates, as start and End number and construct either a list of list, or what @josevalim proposed A flat_map which creates a flat list list of length 40 or so and than makes a Series out of it.
So the problems from my point of few are:
a) Putting a Series of length 40 into a DataFrame of Shape 10, n_cols is not possible?!
b) I don’t know to transform the DataFrame to a length shape of 40, n_cols and preserve the same row order as in the Series.
You talked about grouping. How would it help in this topic?
billylanchantin
Hey @sehHeiden,
I wasn’t able to follow why @josevalim’s suggestion doesn’t work. You say:
I think you’ll need to do the grouping/etc. while it’s still a list. Then I think the lengths should match.
Also, if you’re trying to do interpolation with dates, this answer might help.
sehHeiden
The closest I have seen is the pivot_longer function. But it’s works on existing columns that are combined into one column. But instead of columns I have a list of data (of variable length).
@josevalim I hope that makes clear, what I want. Do you know how to address it?
sehHeiden
Okay, so something like pandas iterrows or apply. I assume that is not possible in Elixir to Enum.map over a Data Frame.
nseaSeb
Yes, I’m not at all sure about this. The map_rows/2 function is not available in Elixir’s Explorer library. It seems to be a function of the df library in R.
However, you can get a similar effect by using Enum.map/2 to iterate over each row of the DataFrame, unless I’m mistaken?